Comment scinder une pandas dataframe ou d'une série par jour (éventuellement à l'aide d'un itérateur)
J'ai une longue série de temps, par exemple.
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'])
Maintenant, je veux extraire tous les sous-DataFrames pour chaque jour, pour obtenir la sortie suivante:
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
Quel est le moyen le plus efficace pour ce faire, en évitant de vérifier si l'index.date==give_date, qui est très lente. Aussi, l'utilisateur ne connaît pas un prieuré de la plage de jours dans le cadre.
Tout soupçon faire cela avec un itérateur?
Ma solution actuelle est, mais il n'est pas aussi élégante et dispose de deux questions définies ci-dessous:
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:])
Cette approche présente les problèmes suivants:
- a=np.unique(df.index.date) peut prendre beaucoup de temps
- df[day_now:day_next] comprend day_next, mais j'ai besoin de l'exclure dans la gamme
Vous devez vous connecter pour publier un commentaire.
Peut-être groupby?
Devrait vous donner une liste de trames de données où chaque bloc de données est un jour de données.
Ou en une seule ligne:
Gotta love python!
Si vous voulez grouper par date (AKA: année+mois+jour), puis utilisez
df.index.date
:Comme
df.index.day
utilisera le jour du mois (c'est à dire: de 1 à 31) pour le groupement, ce qui pourrait entraîner un comportement indésirable si l'entrée dataframe dates de s'étendre à plusieurs mois.