如何按定义的时间间隔对 pandas 数据帧进行分组?

问题描述 投票:0回答:3

我有一个这样的dataFrame,我想每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')) 完成,最好的方法是什么?

提前致以敬意和感谢

python pandas datetime group-by
3个回答
35
投票

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

指定

label='right'
会使时间段从 6:30(较高侧)而不是 5:30 开始分组。 此外,
base
默认设置为 0 ,因此需要将其偏移 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
    

8
投票
使用

DataFrame.resample

,这是一种专门用于时间序列重采样的方法,这样我们就不需要DataFrame.GroupBy
pd.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()
    

0
投票
继续讨论这个问题,由于 Pandas 已经升级了他们的

resample

grouping
rolling
 工作,当前的工作解决方案是这样的:

df.resample(rule='60min', offset='30m', label='right').first()
此外,如果您想以 30 分钟为间隔进行分组,从第一次观察的分钟开始,您可以使用 

origin

 参数和 
label='left'
 在低侧边界上开始每个间隔:

df.resample(rule='30min', origin='start', label='left').first()
尽管如此,这使用了索引中第一个时间戳的 hh:mm:ss。因此,如果您想在 hh:mm 级别切断,那么也许可以预处理您的索引,以便删除秒数(至少在第一次观察时)。

Pandas.Resample 文档中阅读更多内容,他们有很好的工作示例。

© www.soinside.com 2019 - 2024. All rights reserved.