Tronquer la précision de la colonne "TimeStamp" en fonction de l'heure dans la "DataFrame" de pandas

j'ai un pandas.DataFramedf qui a un index généré automatiquement, avec une colonne dt:

df['dt'].dtype, df['dt'][0]
# (dtype('<M8[ns]'), Timestamp('2014-10-01 10:02:45'))

ce que j'aimerais faire, c'est créer une nouvelle colonne tronquée à la précision horaire. Je suis actuellement en utilisant:

df['dt2'] = df['dt'].apply(lambda L: datetime(L.year, L.month, L.day, L.hour))

Cela fonctionne, c'est très bien. Cependant, j'ai un pressentiment qu'il y a un moyen sympa d'utiliser pandas.tseries.offsets ou la création d'un DatetimeIndex ou similaire.

alors, si possible, y en a-t-il pandas magique de faire ça?

21
demandé sur Alex Riley 2015-02-27 23:03:51

2 réponses

Dans les pandas 0.18.0 et plus tard, il y a datetime floor,ceil et round méthodes pour arrondir les horodatages pour une précision fixe/fréquence. Pour arrondir à l'heure de précision, vous pouvez utiliser:

>>> df['dt2'] = df['dt'].dt.floor('h')
>>> df
                      dt                     dt2
0    2014-10-01 10:02:45     2014-10-01 10:00:00
1    2014-10-01 13:08:17     2014-10-01 13:00:00
2    2014-10-01 17:39:24     2014-10-01 17:00:00

Voici une autre alternative pour tronquer les horodateurs. Contrairement à floor, il prend en charge la troncation d'une précision telle que l'année ou le mois.

vous pouvez temporairement ajuster la précision Unité du NumPy sous-jacent--7--> type de données, changement de [ns][h]:

df['dt'].values.astype('<M8[h]')

cela tronque tout à la précision d'heure. Par exemple:

>>> df
                       dt
0     2014-10-01 10:02:45
1     2014-10-01 13:08:17
2     2014-10-01 17:39:24

>>> df['dt2'] = df['dt'].values.astype('<M8[h]')
>>> df
                      dt                     dt2
0    2014-10-01 10:02:45     2014-10-01 10:00:00
1    2014-10-01 13:08:17     2014-10-01 13:00:00
2    2014-10-01 17:39:24     2014-10-01 17:00:00

>>> df.dtypes
dt     datetime64[ns]
dt2    datetime64[ns]

la même méthode devrait fonctionner pour toute autre unité: mois 'M', minutes 'm', et ainsi de suite:

  • Conserver jusqu'à l'année: '<M8[Y]'
  • Conserver jusqu'à mois: '<M8[M]'
  • Tenir à jour: '<M8[D]'
  • Conserver jusqu'à la minute: '<M8[m]'
  • Conserver à la seconde: '<M8[s]'
44
répondu Alex Riley 2017-12-18 09:08:40

une méthode que j'ai utilisée dans le passé pour atteindre cet objectif était la suivante (assez similaire à ce que vous faites déjà, mais j'ai pensé que je le jetterais là-bas de toute façon):

df['dt2'] = df['dt'].apply(lambda x: x.replace(minute=0, second=0))
2
répondu David Hagan 2016-11-04 08:01:10