使用非午夜开始时间的分组日期

时间:2019-10-01 18:08:37

标签: pandas group-by timestamp resampling

我正在按日期汇总一些数据。

us-central1

现在,我想做同样的事情,但是不使用午夜作为时间偏移。 不过,我想使用groupby,例如在6 AM-6AM箱中。 有没有比虚拟列更好的解决方案? 不幸的是,如

中所述重新采样

Resample daily pandas timeseries with start at time other than midnight Resample hourly TimeSeries with certain starting hour

不起作用,因为我确实需要应用任何重采样/聚合功能

2 个答案:

答案 0 :(得分:3)

例如,您可以在分组之前减去偏移量:

for dt, group in df.groupby(df.timestamp.sub(pd.to_timedelta('6H')).dt.date):
    # do stuff

答案 1 :(得分:1)

baseresample提供了一个pd.Grouper参数,旨在处理这种情况。有很多方法可以做到这一点,选择您认为更清晰的那个。

  • “ {1D}”频率为base=0.25
  • “ 24h”频率,base=6
  • 使用“ base=360”的“ 1440min”频率

代码

df = pd.DataFrame({'timestamp': pd.date_range('2010-01-01', freq='10min', periods=200)})

df.resample(on='timestamp', rule='1D', base=0.25).timestamp.agg(['min', 'max'])
#df.resample(on='timestamp', rule='24h', base=6).timestamp.agg(['min', 'max'])
#df.resample(on='timestamp', rule=f'{60*24}min', base=60*6).timestmap.agg(['min', 'max'])

                                    min                 max
timestamp                                                  
2009-12-31 06:00:00 2010-01-01 00:00:00 2010-01-01 05:50:00  #[Dec31 6AM - Jan1 6AM)
2010-01-01 06:00:00 2010-01-01 06:00:00 2010-01-02 05:50:00  #[Jan1 6AM - Jan2 6AM)
2010-01-02 06:00:00 2010-01-02 06:00:00 2010-01-02 09:10:00  #[Jan2 6AM - Jan3 6AM)

出于完整性考虑,resample是一种便捷方法,并且在所有方面都与groupby相同。如果由于某种原因您绝对不能使用resample,可以这样做:

for dt, gp in df.groupby(pd.Grouper(key='timestamp', freq='24h', base=6)):
    ...

等效于

for dt, gp in df.resample(on='timestamp', rule='24h', base=6):
    ...