如何使用 pandas 中的时移按天分组?

How to group by days with a timeshift in pandas?

我有一个带有 DataTimeIndex 的 DataFrame,我试图找到 00:00 之后的第一个时间戳和即将到来的一天的 00:00 之间的最大值。现在我有一个使用 pd.groupby() 和按天索引的工作解决方案。

这是一个最小的例子,最大值为 24,每天按小时移动:

df = pd.DataFrame(
    {'v':list(range(25))*3},
     index=pd.date_range('2020-01-01', freq='1H', periods=25*3)
)
df.index.name = 'datetime'
gg = df.groupby(df.index.copy().tz_localize(None).to_period("D"))
m = pd.merge(gg.idxmax(), gg.max(), on="datetime")
m.columns = ["idxmax", "max"]
>>> m
                        idxmax  max
datetime                           
2020-01-01 2020-01-01 23:00:00   23
2020-01-02 2020-01-02 00:00:00   24
2020-01-03 2020-01-03 01:00:00   24
2020-01-04 2020-01-04 02:00:00   24

我要找的是

                        idxmax  max
datetime                           
2019-12-31 2020-01-01 00:00:00   0
2020-01-01 2020-01-02 00:00:00   24
2020-01-02 2020-01-03 00:00:00   23
2020-01-03 2020-01-03 01:00:00   24
2020-01-04 2020-01-04 02:00:00   24

如何创建想要的结果?

好的。我找到了 pd.Timdelta.

的解决方案
df = pd.DataFrame({'v':list(range(25))*3}, index=pd.date_range('2020-01-01', freq='1H', periods=25*3))
df.index.name = 'datetime'
df.index -= pd.Timedelta('1h')
gg = df.groupby(df.index.copy().tz_localize(None).to_period("D"))
m = pd.merge(gg.idxmax()+pd.Timedelta('1h'), gg.max(), on="datetime")
m.columns = ["idxmax", "max"]
>>>                        idxmax  max
datetime                           
2019-12-31 2020-01-01 00:00:00    0
2020-01-01 2020-01-02 00:00:00   24
2020-01-02 2020-01-03 00:00:00   23
2020-01-03 2020-01-03 01:00:00   24
2020-01-04 2020-01-04 02:00:00   24

怎么样:

df = pd.DataFrame({'v':list(range(25))*3}, index=pd.date_range('2020-01-01', freq='1H', periods=25*3))
df.index.name = 'datetime'
df.index -= pd.Timedelta('1h')
df = pd.merge_asof( df, df.resample('D')['v'].max().rename('v_max'), left_index=True, right_index=True)
df.index += pd.Timedelta('1h')
df

使用 Grouperoffset 参数:

df = pd.DataFrame(
    {'v':list(range(25))*3},
     index=pd.date_range('2020-01-01', freq='1H', periods=25*3)
)
df.index.name = 'datetime'

#if necessary
df.index = df.index.tz_localize(None)
gg = df.groupby(pd.Grouper(freq='D', offset='1H'))
m = pd.merge(gg.idxmax(), gg.max(), on="datetime")
m.columns = ["idxmax", "max"]
print (m)
                                 idxmax  max
datetime                                    
2019-12-31 01:00:00 2020-01-01 00:00:00    0
2020-01-01 01:00:00 2020-01-02 00:00:00   24
2020-01-02 01:00:00 2020-01-03 00:00:00   23
2020-01-03 01:00:00 2020-01-03 01:00:00   24
2020-01-04 01:00:00 2020-01-04 02:00:00   24