J'ai un cadre de données df qui ressemble à ceci. Date et heure sont 2 index multiniveau
observation1 observation2
date Time
2012-11-02 9:15:00 79.373668 224
9:16:00 130.841316 477
2012-11-03 9:15:00 45.312814 835
9:16:00 123.776946 623
9:17:00 153.76646 624
9:18:00 463.276946 626
9:19:00 663.176934 622
9:20:00 763.77333 621
2012-11-04 9:15:00 115.449437 122
9:16:00 123.776946 555
9:17:00 153.76646 344
9:18:00 463.276946 212
Je veux avoir un processus complexe sur bloc de données quotidien.
Le code Psuedo ressemblerait à
for count in df(level 0 index) :
new_df = get only chunk for count
complex_process(new_df)
Donc, tout d’abord, je n’ai pas pu trouver un moyen d’accéder uniquement à des blocs pour une date.
2012-11-03 9:15:00 45.312814 835
9:16:00 123.776946 623
9:17:00 153.76646 624
9:18:00 463.276946 626
9:19:00 663.176934 622
9:20:00 763.77333 621
et ensuite l'envoyer pour traitement. Je le fais dans la boucle car je ne suis pas sûr s'il y a un moyen de le faire sans mentionner la valeur exacte de la colonne de niveau 0. J'ai fait une recherche de base et j'ai pu obtenir df.index.get_level_values (0), mais cela me renvoie toutes les valeurs et cela entraîne l'exécution de la boucle plusieurs fois par jour. Je souhaite créer un cadre de données par jour et l'envoyer pour traitement.
Un moyen simple serait de grouper par le premier niveau de l'index - une itération sur l'objet groupby renverra les clés de groupe et une sous-trame contenant chaque groupe.
In [136]: for date, new_df in df.groupby(level=0):
...: print(new_df)
...:
observation1 observation2
date Time
2012-11-02 9:15:00 79.373668 224
9:16:00 130.841316 477
observation1 observation2
date Time
2012-11-03 9:15:00 45.312814 835
9:16:00 123.776946 623
9:17:00 153.766460 624
9:18:00 463.276946 626
9:19:00 663.176934 622
9:20:00 763.773330 621
observation1 observation2
date Time
2012-11-04 9:15:00 115.449437 122
9:16:00 123.776946 555
9:17:00 153.766460 344
9:18:00 463.276946 212
Et ça?
for idate in df.index.get_level_values('date'):
complex_process(df.ix[idate], idate)
En repérant @psorenson, nous pouvons obtenir des index de niveau uniques et les tranches de trames de données associées sans numpy, comme suit:
for date in df.index.get_level_values('date').unique():
print(df.loc[date])