Utilizo pandas.to_datetime
para analizar las fechas en mis datos. Pandas por defecto representa las fechas con datetime64[ns]
aunque las fechas son todas diarias. Me pregunto si hay una forma elegante / inteligente de convertir las fechas datetime.date
o datetime64[D]
para que, cuando escribo los datos en CSV, no se agreguen las fechas 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 realmente lento ya que tengo muchas filas y de alguna manera frustra el propósito de usar pandas.to_datetime
. ¿Hay alguna forma de convertir la dtype
columna completa de una vez? O bien, ¿ pandas.to_datetime
admite una especificación de precisión para poder deshacerme del tiempo mientras trabajo con datos diarios?
df.dates.apply(lambda x: x.date())
debería ser al menos un poco más rápido. también eche un vistazo a github.com/pydata/pandas/issues/2583Respuestas:
Desde la versión,
0.15.0
esto ahora se puede hacer fácilmente usando.dt
para acceder solo al componente de fecha:Lo anterior devuelve un
datetime.date
dtype, si desea tener undatetime64
entonces puede simplementenormalize
el componente de tiempo a medianoche para que establezca todos los valores en00:00:00
:Esto mantiene el dtype como
datetime64
pero la pantalla muestra solo eldate
valor.fuente
Solución simple:
fuente
Si bien voté por 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 se basa en
datetime
objetos de Python y, por lo tanto, no se vectorizará ninguna operación en ellos, es decir, será lento)Una mejor alternativa de rendimiento es usar
df['dates'].dt.floor('d')
. Estrictamente hablando, no "mantiene solo una parte de la fecha", ya que solo establece el tiempo para00:00:00
. Pero funciona como lo desea el OP cuando, por ejemplo:groupby
... y es mucho más eficiente, ya que la operación está vectorizada.
EDIT: de hecho, la respuesta habría preferido que el de OP es probablemente "las versiones recientes de
pandas
qué no escriben el tiempo para csv si es00:00:00
para todas las observaciones".fuente
to_json
todavía escribe el completo00:00:00
.date_format='iso'
?! Por defecto, solo genera segundos desde la época.dt.normalize()
en series de más de unos cientos de elementos.Los pandas
DatetimeIndex
ySeries
tienen un método llamadonormalize
que hace exactamente lo que quieres.Puedes leer más sobre esto en esta respuesta .
Se puede usar como
ser.dt.normalize()
fuente
Pandas v0.13 +: Usar
to_csv
condate_format
parámetroEvite, cuando sea posible, convertir su
datetime64[ns]
serie en unaobject
serie dtype dedatetime.date
objetos. Este último, a menudo construido utilizandopd.Series.dt.date
, se almacena como una matriz de punteros y es ineficiente en relación con una serie pura basada en NumPy.Como su preocupación es el formato al escribir en CSV , simplemente use el
date_format
parámetro deto_csv
. Por ejemplo:Vea las
strftime
directivas de Python para las convenciones de formato.fuente
Esta es una manera simple de extraer la fecha:
fuente
Convirtiendo a
datetime64[D]
:Aunque reasignar eso a una columna DataFrame lo revertirá a [ns].
Si querías real
datetime.date
:fuente
dt
este fragmento de respuesta sobrescribirá ese módulo. @ Dale-Jung, tal vez podría cambiar la línea a algo así como dt_indexdf.loc[date]
método, los revierte Vuelta a una marca de tiempo, es decir, las comparaciones posteriores ya no funcionanSimplemente dando una respuesta más actualizada en caso de que alguien vea esta publicación anterior.
Agregar "utc = False" al convertir a datetime eliminará el componente de zona horaria y mantendrá solo la fecha en un tipo de datos datetime64 [ns].
Podrá guardarlo en Excel sin obtener el error "ValueError: Excel no admite fechas y horas con zonas horarias. Asegúrese de que las horas no sean conscientes de la zona horaria antes de escribir en Excel".
fuente
Quería poder cambiar el tipo de un conjunto de columnas en un marco de datos y luego eliminar la hora que guarda el día. round (), floor (), ceil () todo el trabajo
fuente