Mantenga solo la parte de la fecha cuando use pandas.to_datetime

Resuelto asked hace 11 años • 0 respuestas

Utilizo pandas.to_datetimepara analizar las fechas en mis datos. Pandas representa de forma predeterminada las fechas con datetime64[ns], aunque todas las fechas son solo diarias. Me pregunto si existe una forma elegante/inteligente de convertir las fechas para datetime.dateque datetime64[D], cuando escriba los datos en CSV, las fechas no se agreguen 00:00:00. Sé que puedo convertir el tipo manualmente elemento por elemento:

[dt.to_datetime().date() for dt in df.dates]

Pero esto es muy lento ya que tengo muchas filas y en cierto modo anula el propósito de usar pandas.to_datetime. ¿ Hay alguna manera de convertir dtypetoda la columna a la vez? O, alternativamente, ¿ pandas.to_datetimeadmite una especificación de precisión para poder deshacerme de la parte de tiempo mientras trabajo con datos diarios?

 avatar Apr 24 '13 01:04
Aceptado

Desde la versión0.15.0 , esto ahora se puede hacer fácilmente usando .dtpara acceder solo al componente de fecha:

df['just_date'] = df['dates'].dt.date

Lo anterior devuelve datetime.date, entonces objectdtype. Si desea mantener el tipo d, datetime64puede simplemente normalize:

df['normalised_date'] = df['dates'].dt.normalize()

Esto establece el componente de hora en medianoche, es decir 00:00:00, pero la pantalla muestra sólo el valor de la fecha.

  • pandas.Series.dt
EdChum avatar Dec 14 '2015 22:12 EdChum

Solución simple:

df['date_only'] = df['date_time_column'].dt.date
Gil Baggio avatar May 20 '2019 10:05 Gil Baggio

Si bien voté a favor de la respuesta de EdChum , que es la respuesta más directa a la pregunta que planteó el OP, en realidad no resuelve el problema de rendimiento (todavía depende de datetimeobjetos de Python y, por lo tanto, cualquier operación sobre ellos no se vectorizará; es decir, será lento).

Una alternativa de mejor rendimiento es:

df['dates'].dt.floor('d')

Estrictamente hablando, no "mantiene sólo la parte de la fecha", ya que simplemente establece la hora en 00:00:00. Pero funciona según lo deseado por el OP cuando, por ejemplo:

  • imprimiendo a la pantalla
  • guardando en csv
  • usando la columna paragroupby

... y es mucho más eficiente, ya que la operación está vectorizada.

EDITAR: de hecho, la respuesta que los OP hubieran preferido es probablemente "las versiones recientes de pandasno escriban la hora en csv si es 00:00:00para todas las observaciones".

Pietro Battiston avatar Jan 18 '2017 11:01 Pietro Battiston

Pandas v0.13+: Usar to_csvcon date_formatparámetro

Evite, siempre que sea posible, convertir su datetime64[ns]serie en una objectserie de datetime.dateobjetos tipo d. Este último, a menudo construido usando pd.Series.dt.date, se almacena como una matriz de punteros y es ineficiente en relación con una serie pura basada en NumPy.

Dado que su preocupación es el formato al escribir en CSV , simplemente use el date_formatparámetro de to_csv. Por ejemplo:

df.to_csv(filename, date_format='%Y-%m-%d')

Consulte las directivas de Pythonstrftime para conocer las convenciones de formato.

jpp avatar Dec 14 '2018 00:12 jpp