2017-10-27 9 views
1

ユーザーのログインとログアウトのログがあります。特定のユーザーが特定の15分のウィンドウ内にオンラインであるかどうかを示すログを作成したいと思います。resand/timedeltaを使用したpandasオンラインログ

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

は、ここに1つの方法です。まず、空の作成/すべてのユーザー/時間のためのデータフレームをゼロ:

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ありがとう! –

関連する問題