Utilizo pandas.to_datetimepara 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.dateo 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 dtypecolumna completa de una vez? O bien, ¿ pandas.to_datetimeadmite 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.0esto ahora se puede hacer fácilmente usando.dtpara acceder solo al componente de fecha:Lo anterior devuelve un
datetime.datedtype, si desea tener undatetime64entonces puede simplementenormalizeel componente de tiempo a medianoche para que establezca todos los valores en00:00:00:Esto mantiene el dtype como
datetime64pero la pantalla muestra solo eldatevalor.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
datetimeobjetos 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
pandasqué no escriben el tiempo para csv si es00:00:00para todas las observaciones".fuente
to_jsontodaví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
DatetimeIndexySeriestienen un método llamadonormalizeque 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_csvcondate_formatparámetroEvite, cuando sea posible, convertir su
datetime64[ns]serie en unaobjectserie dtype dedatetime.dateobjetos. 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_formatparámetro deto_csv. Por ejemplo:Vea las
strftimedirectivas 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
dteste 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