如何按定义的时间间隔对熊猫数据框进行分组?

Posted

技术标签:

【中文标题】如何按定义的时间间隔对熊猫数据框进行分组?【英文标题】:How to group a pandas dataframe by a defined time interval? 【发布时间】:2017-07-04 11:20:44 【问题描述】:

我有一个这样的数据框,我想每 60 分钟分组一次,并在 06:30 开始分组。

                           data
index
2017-02-14 06:29:57    11198648
2017-02-14 06:30:01    11198650
2017-02-14 06:37:22    11198706
2017-02-14 23:11:13    11207728
2017-02-14 23:21:43    11207774
2017-02-14 23:22:36    11207776

我正在使用:

df.groupby(pd.TimeGrouper(freq='60Min'))

我得到了这个分组:

                      data
index       
2017-02-14 06:00:00     x1
2017-02-14 07:00:00     x2
2017-02-14 08:00:00     x3
2017-02-14 09:00:00     x4
2017-02-14 10:00:00     x5

但我正在寻找这个结果:

                      data
index       
2017-02-14 06:30:00     x1
2017-02-14 07:30:00     x2
2017-02-14 08:30:00     x3
2017-02-14 09:30:00     x4
2017-02-14 10:30:00     x5

如何让函数在 6:30 开始以一小时为间隔进行分组?

如果 .groupby(pd.TimeGrouper(freq='60Min')) 做不到,最好的方法是什么?

提前打个招呼,非常感谢

【问题讨论】:

【参考方案1】:

使用DataFrame.resample,这是一种专门用于重采样时间序列的方法,这样我们就不需要DataFrame.GroupBypd.Grouper

df.resample('60min', base=30, label='right').first()

输出

                           data
index                          
2017-02-14 06:30:00  11198648.0
2017-02-14 07:30:00  11198650.0
2017-02-14 08:30:00         NaN
2017-02-14 09:30:00         NaN
2017-02-14 10:30:00         NaN
2017-02-14 11:30:00         NaN
2017-02-14 12:30:00         NaN
2017-02-14 13:30:00         NaN
2017-02-14 14:30:00         NaN
2017-02-14 15:30:00         NaN
2017-02-14 16:30:00         NaN
2017-02-14 17:30:00         NaN
2017-02-14 18:30:00         NaN
2017-02-14 19:30:00         NaN
2017-02-14 20:30:00         NaN
2017-02-14 21:30:00         NaN
2017-02-14 22:30:00         NaN
2017-02-14 23:30:00  11207728.0

注意:当您的数据框中有多个列时,您必须指定要聚合的列:

df.resample('60min', base=30, label='right')['data'].first()

【讨论】:

【参考方案2】:

pd.Grouper 中将base=30label='right' 参数结合使用。

指定 label='right' 会使时间段从 6:30(较高的一侧)而不是 5:30 开始分组。 此外,base 设置为 0 by default,因此需要将它们偏移 30 以考虑日期的前向传播。

假设,你想聚合每个子组的第一个元素,那么:

df.groupby(pd.Grouper(freq='60Min', base=30, label='right')).first()
# same thing using resample - df.resample('60Min', base=30, label='right').first()

产量:

                           data
index                          
2017-02-14 06:30:00  11198648.0
2017-02-14 07:30:00  11198650.0
2017-02-14 08:30:00         NaN
2017-02-14 09:30:00         NaN
2017-02-14 10:30:00         NaN
2017-02-14 11:30:00         NaN
2017-02-14 12:30:00         NaN
2017-02-14 13:30:00         NaN
2017-02-14 14:30:00         NaN
2017-02-14 15:30:00         NaN
2017-02-14 16:30:00         NaN
2017-02-14 17:30:00         NaN
2017-02-14 18:30:00         NaN
2017-02-14 19:30:00         NaN
2017-02-14 20:30:00         NaN
2017-02-14 21:30:00         NaN
2017-02-14 22:30:00         NaN
2017-02-14 23:30:00  11207728.0

【讨论】:

为什么 Pandas 中没有这个函数的文档?有什么办法可以看到 pd.TimeGrouper 函数的代码??我记得在R中你可以看到写函数名的代码不带括号,在python中有类似的东西吗?? Complete code of pd.TimeGrouper。它也从Complete code of resample 继承了一些**kwargs(例如:base)。 如果您使用的是 Jupyter,help(pd.TimeGrouper) 还会为您提供有关其用法、数据描述符、允许的参数、定义的方法等的简短说明。 现在有弃用警告。如果您想期待简单的升级,我想现在使用pandas.pydata.org/pandas-docs/stable/generated/…

以上是关于如何按定义的时间间隔对熊猫数据框进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

如何按多列分组以在熊猫数据框中列出

嵌套熊猫数据框 - 如何按数据选择/分组?

按列表列中的元素对 Pandas 数据框进行分组

在熊猫数据框中对重复的列 ID 进行分组

按 10 分钟间隔对 pandas DataFrame 进行分组[重复]

如何使用熊猫按 10 分钟对时间序列进行分组