Considere el siguiente ejemplo
import datetime import pandas as pd df = pd.DataFrame({'var' : np.random.randint(0,10, size = 16993)}, index = pd.date_range('2021-01-01 00:00:00', '2021-03-01 00:00:00', freq ='5 min')) df.head(10) Out[272]: var 2021-01-01 00:00:00 5 2021-01-01 00:05:00 9 2021-01-01 00:10:00 1 2021-01-01 00:15:00 5 2021-01-01 00:20:00 8 Este es un marco de datos clásico con datos intradía. Necesito agregarlo a nivel diario, pero no quiero usar las 24 horas desde las 00:00:00 hasta 23:59:59 que se usarían implícitamente si ejecutara df.groupby(df.index.date)
df.groupby(df.index.date).agg('sum').head() Out[274]: var 2021-01-01 1440 2021-01-02 1238 2021-01-03 1274 2021-01-04 1277 2021-01-05 1253 Más bien, quiero agregar usando una ventana de 24 horas que comienza a la 1:00:00 todos los días. Así que el primer grupo será entre 2021-01-01 01:00:00 y 2021-02-01 00:59:59 , el segundo entre 2021-02-01 01:00:00 y 2021-03-01 00:59:59 , y así sucesivamente. Los horarios de inicio se pueden identificar fácilmente, como se muestra a continuación.
df['flag'] = df.index.time == datetime.time(1,0)¿Cuál es la mejor manera de proceder para crear los grupos? ¡Gracias!
Resample con offset El parámetro de compensación es el Timedelta que se puede agregar al origen para crear intervalos de agrupación personalizados
df.resample('D', offset=pd.Timedelta(hours=1)).sum() var 2020-12-31 01:00:00 72 2021-01-01 01:00:00 1278 2021-01-02 01:00:00 1301 2021-01-03 01:00:00 1291 2021-01-04 01:00:00 1346 ....Puede usar groupby.sum si resta 1H del mero:
df.groupby((df.index - pd.Timedelta('1H')).date).sum() # var # 2020-12-31 58 # 2021-01-01 1319 # 2021-01-02 1261 # ... ... # 2021-02-26 1286 # 2021-02-27 1246 # 2021-02-28 1240