Существует аргумент base
для resample
или pd.Grouper
, который предназначен для обработки этой ситуации. Есть много способов сделать это, выберите то, что вам кажется более ясным.
- 1D частота с
base=0.25
- '24h' частота с
base=6
- частота '1440мин' с
base=360
Код
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):
...