web-dev-qa-db-fra.com

Python Pandas: regrouper la colonne datetime en agrégations d'heures et de minutes

Cela semble être assez simple, mais après presque une journée entière, je n'ai pas trouvé la solution. J'ai chargé ma trame de données avec read_csv et j'ai facilement analysé, combiné et indexé une date et une colonne d'heure dans une colonne, mais maintenant je veux pouvoir remodeler et effectuer des calculs basés sur des groupes d'heures et de minutes similaires à ce que vous pouvez faire dans Pivot Excel.

Je sais comment rééchantillonner à l'heure ou à la minute mais il conserve la partie date associée à chaque heure/minute alors que je veux agréger l'ensemble de données UNIQUEMENT à l'heure et à la minute, comme pour le regroupement dans les pivots Excel et en sélectionnant "heure" et "minute" mais ne rien sélectionner d'autre.

Toute aide serait grandement appréciée.

48
horatio1701d

Vous ne pouvez pas faire, où df est votre DataFrame:

times = pd.to_datetime(df.timestamp_col)
df.groupby([times.hour, times.minute]).value_col.sum()
45
Wes McKinney

Le code de Wes n'a pas fonctionné pour moi. Mais la fonction DatetimeIndex ( docs ) a fait:

times = pd.DatetimeIndex(data.datetime_col)
grouped = df.groupby([times.hour, times.minute])

L'objet DatetimeIndex est une représentation des heures dans les pandas. La première ligne crée un tableau des horaires. La deuxième ligne utilise ce tableau pour obtenir les données d'heure et de minute pour toutes les lignes, permettant aux données d'être regroupées ( docs ) par ces valeurs.

34
Nix G-D

Je suis tombé sur cela lorsque je cherchais ce type de groupby. Le code de Wes ci-dessus n'a pas fonctionné pour moi, je ne sais pas si c'est parce que les changements dans pandas au fil du temps.

Dans pandas 0.16.2, ce que j'ai finalement fait:

grp = data.groupby(by=[data.datetime_col.map(lambda x : (x.hour, x.minute))])
grp.count()

Vous auriez (heure, minute) des tuples comme index groupé. Si vous souhaitez un multi-index:

grp = data.groupby(by=[data.datetime_col.map(lambda x : x.hour),
                       data.datetime_col.map(lambda x : x.minute)])
15
WillZ