我在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
这只是示例响应,并非完全正确。
答案 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]