pandas在线记录resample / timedelta

时间:2017-10-27 16:15:09

标签: python pandas datetime pandas-groupby

我有一个用户登录和注销时间的日志。我想创建一个日志,显示特定用户是否在特定的十五分钟窗口中在线。

pandas有不同的日期时间索引选项(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 个答案:

答案 0 :(得分: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