Cómo dividir un dataframe o serie de pandas por día (posiblemente utilizando un iterador)

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:

  • a = np.unique (df.index.date) puede llevar mucho tiempo
  • df [day_now: day_next] incluye el day_next, pero necesito excluirlo en el rango

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.