Tengo una larga serie de tiempo, por ejemplo.
import pandas as pd index=pd.date_range(start='2012-11-05', end='2012-11-10', freq='1S').tz_localize('Europe/Berlin') df=pd.DataFrame(range(len(index)), index=index, columns=['Number'])
Ahora quiero extraer todos los sub-cuadros de datos para cada día, para obtener el siguiente resultado:
df_2012-11-05: data frame with all data referring to day 2012-11-05 df_2012-11-06: etc. df_2012-11-07 df_2012-11-08 df_2012-11-09 df_2012-11-10
¿Cuál es la forma más efectiva de hacer esto evitando verificar si el index.date == give_date es muy lento? Además, el usuario no conoce a priori el rango de días en el marco.
¿Alguna pista hacer esto con un iterador?
Mi solución actual es esta, pero no es tan elegante y tiene dos problemas que se definen a continuación:
time_zone='Europe/Berlin' # find all days a=np.unique(df.index.date) # this can take a lot of time a.sort() results=[] for i in range(len(a)-1): day_now=pd.Timestamp(a[i]).tz_localize(time_zone) day_next=pd.Timestamp(a[i+1]).tz_localize(time_zone) results.append(df[day_now:day_next]) # how to select if I do not want day_next included? # last day results.append(df[day_next:])
Este enfoque tiene los siguientes problemas:
Tal vez groupby?
DFList = [] for group in df.groupby(df.index.day): DFList.append(group[1])
Debería darle una lista de marcos de datos donde cada dataframe es un día de datos.
O en una línea:
DFList = [group[1] for group in df.groupby(df.index.day)]
Tengo que amar a Python!
Si desea agrupar por fecha (AKA: año + mes + día), use df.index.date
:
result = [group[1] for group in df.groupby(df.index.date)]
Como df.index.day
utilizará el día del mes (es decir, de 1 a 31) para la agrupación, lo que podría resultar en un comportamiento no deseado si las fechas del dataframe de entrada se extienden a varios meses.