【问题标题】:Pandas time series group by every 15 minutesPandas 时间序列每 15 分钟分组一次
【发布时间】:2019-09-03 15:51:28
【问题描述】:

我在熊猫数据框中有以下格式的数据。我想每 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

这只是一个不完全预期的示例响应。

【问题讨论】:

  • 你的预期输出是什么?
  • 类似这样的 ``` 时间窗口 事件平均时间(分钟) 2019-08-30 13:00:00 18:10 2019-08-30 13:30:00 35:00 2019-08-30 14:00:00 17:00 ```这只是一个不完全预期的示例响应。
  • 请在您的问题中格式化。
  • 完成。请检查编辑。

标签: python pandas dataframe time-series


【解决方案1】:

从计算附加列开始 - 持续时间(以分钟为单位)(表示为 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,但如果您对此不满意 详细信息,您可以将分钟“重新格式化”为 浮动 到您想要的格式。

只需一条指令即可完成:

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]

【讨论】:

  • 太棒了,就像一个魅力。感谢您的快速回复。
猜你喜欢
  • 2017-08-26
  • 1970-01-01
  • 2021-01-06
  • 2017-06-30
  • 2020-03-22
  • 1970-01-01
  • 2020-10-07
  • 2015-02-26
  • 1970-01-01
相关资源
最近更新 更多