熊猫时间序列每15分钟进行一次分组

时间:2019-09-03 15:51:28

标签: python pandas dataframe time-series

我在pandas数据框中有以下格式的数据。我希望每30分钟或1小时查看一次活动的平均持续时间。

id            begin_time                    end_time
499078360    2019-08-30 13:26:04.124235    2019-08-30 13:42:23.680142
499074090    2019-08-30 13:21:57.685308    2019-08-30 13:39:57.993772
499084485    2019-08-30 13:32:11.533709    2019-08-30 13:45:45.307579
499088441    2019-08-30 13:36:06.971633    2019-08-30 13:48:42.160393
499088460    2019-08-30 13:36:07.935704    2019-08-30 13:48:30.037312

这就是我每5分钟统计一次事件数量的方式。

enter_count = df['begin_time'].value_counts()
exit_count = df["end_time"].value_counts()
df2 = pd.concat([enter_count, exit_count], axis=1, keys=["enter", "exit"])
df2.fillna(0, inplace=True)
df2["diff"] = df2["enter"] - df2["exit"]
df2["diff"] = df2["enter"] - df2["exit"]
counts = df2["diff"].resample("5min", how="sum").fillna(0).cumsum()

但是我打算在每30分钟或1小时的时间范围内获得一次事件的平均持续时间

任何建议将不胜感激。

编辑

预期的样本响应:

Time window                 Average Time of the event (minutes)
2019-08-30 13:00:00        18:10
2019-08-30 13:30:00        35:00
2019-08-30 14:00:00        17:00

这只是示例响应,并非完全正确。

1 个答案:

答案 0 :(得分:2)

从计算其他列开始-持续时间(以分钟为单位)(表示为 float ):

df['durMin'] = (df.end_time - df.begin_time) / pd.offsets.Minute()

对于您的样本数据,结果为:

          id                 begin_time                   end_time     durMin
0  499078360 2019-08-30 13:26:04.124235 2019-08-30 13:42:23.680142  16.325932
1  499074090 2019-08-30 13:21:57.685308 2019-08-30 13:39:57.993772  18.005141
2  499084485 2019-08-30 13:32:11.533709 2019-08-30 13:45:45.307579  13.562898
3  499088441 2019-08-30 13:36:06.971633 2019-08-30 13:48:42.160393  12.586479
4  499088460 2019-08-30 13:36:07.935704 2019-08-30 13:48:30.037312  12.368360

然后,要获取结果,请运行:

mt = df.set_index('begin_time').durMin.resample('30min').mean()

结果是:

begin_time
2019-08-30 13:00:00    17.165536
2019-08-30 13:30:00    12.839246
Freq: 30T, Name: durMin, dtype: float64

与您的期望相差很小,即您想要 结果格式为 mm:ss ,但是如果您对此不满意, 详细信息,您可以将分钟“重新格式化”为 float 到您想要的格式。

您可以通过一条指令来完成它:

pd.to_timedelta(mt, unit='m')

获取:

begin_time
2019-08-30 13:00:00   00:17:09.932185
2019-08-30 13:30:00   00:12:50.354746
Freq: 30T, Name: durMin, dtype: timedelta64[ns]