Mantenga solo la parte de la fecha cuando use pandas.to_datetime
Utilizo pandas.to_datetime
para 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.date
que 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 dtype
toda la columna a la vez? O, alternativamente, ¿ pandas.to_datetime
admite una especificación de precisión para poder deshacerme de la parte de tiempo mientras trabajo con datos diarios?
Desde la versión0.15.0
, esto ahora se puede hacer fácilmente usando .dt
para acceder solo al componente de fecha:
df['just_date'] = df['dates'].dt.date
Lo anterior devuelve datetime.date
, entonces object
dtype. Si desea mantener el tipo d, datetime64
puede 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
Solución simple:
df['date_only'] = df['date_time_column'].dt.date
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 datetime
objetos 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 para
groupby
... 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 pandas
no escriban la hora en csv si es 00:00:00
para todas las observaciones".
Pandas v0.13+: Usar to_csv
con date_format
parámetro
Evite, siempre que sea posible, convertir su datetime64[ns]
serie en una object
serie de datetime.date
objetos 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_format
pará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.