2017-10-27 2 views
1

사용자가 로그인 및 로그 아웃 할 때의 로그가 있습니다. 특정 사용자가 특정 15 분 동안 온라인 상태인지 보여주는 로그를 작성하려고합니다.resample/timedelta를 사용한 pandas 온라인 로깅

팬던 스는 다른 datetime 인덱싱 옵션 (date_range, period_range)을 가지고 있지만, pd.date_range(start, stop, freq)과 같은 것을 사용하고 있지만 어디에서해야할지 모릅니다.

여기에 데이터의 :

user start      stop 
Alice 2017-10-02 08:59:40-04:00 2017-10-02 09:25:49-04:00 
Joe  2017-10-02 08:59:45-04:00 2017-10-02 10:45:11-04:00 
Bob  2017-10-02 09:16:06-04:00 2017-10-02 10:05:53-04:00 

여기 내가 필요로하는 무엇 (0 오프라인, 1 온라인) :

period   Alice Joe Bob 
2017-10-02 09:00 1  1 0 
2017-10-02 09:15 1  1 1 
2017-10-02 09:30 0  1 1 

답변

1

여기에 하나의 방법입니다. 먼저 빈을 생성/모든 사용자/시간 DataFrame을 제로 :

In [11]: res = pd.DataFrame({name: 0 for name in df["user"].unique()}, pd.date_range("2017-10-02 09:00", "2017-10-02 11:00", freq="15T")) 

In [12]: res 
Out[12]: 
        Alice Bob Joe 
2017-10-02 09:00:00  0 0 0 
2017-10-02 09:15:00  0 0 0 
2017-10-02 09:30:00  0 0 0 
2017-10-02 09:45:00  0 0 0 
2017-10-02 10:00:00  0 0 0 
2017-10-02 10:15:00  0 0 0 
2017-10-02 10:30:00  0 0 0 
2017-10-02 10:45:00  0 0 0 
2017-10-02 11:00:00  0 0 0 

사용자가 로그인 한 경우 이제 회/세트를 기입 :

In [13]: for _, row in df.iterrows(): 
    ...:  res.loc[row["start"]:row["stop"], row["user"]] = 1 
    ...: 

In [14]: res 
Out[14]: 
        Alice Bob Joe 
2017-10-02 09:00:00  1 0 1 
2017-10-02 09:15:00  1 0 1 
2017-10-02 09:30:00  0 1 1 
2017-10-02 09:45:00  0 1 1 
2017-10-02 10:00:00  0 1 1 
2017-10-02 10:15:00  0 0 1 
2017-10-02 10:30:00  0 0 1 
2017-10-02 10:45:00  0 0 1 
2017-10-02 11:00:00  0 0 0 
+0

천재! 고맙습니다! sidenote : iterrows, itertuples 및 set_value 트립 나를 위로, 이것은 훨씬 더 읽을 수 있습니다 –

+0

@HIramFoster 그것이 당신을 위해 그것을 해결한다면 동의하십시오 :) https://stackoverflow.com/help/someone-answers thanks! –

관련 문제