python - parse - pandas working with datetime
Mantener solo la parte de la fecha cuando se usa pandas.to_datetime (5)
Yo uso 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 existe una forma inteligente / inteligente de convertir las fechas a datetime.date
o datetime64[D]
para que, cuando escriba los datos en CSV, las fechas no se añadan con 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 pandas.to_datetime
derrota el propósito de usar pandas.to_datetime
. ¿Hay alguna forma de convertir el dtype
de toda la columna a la vez? O, como alternativa, ¿ pandas.to_datetime
una especificación de precisión para que pueda deshacerme de la parte de tiempo mientras trabajo con datos diarios?
Convirtiendo a datetime64[D]
:
df.dates.values.astype(''M8[D]'')
Aunque volver a asignar eso a una columna de DataFrame lo revertirá a [ns].
Si quería datetime.date
real:
dt = pd.DatetimeIndex(df.dates)
dates = np.array([datetime.date(*date_tuple) for date_tuple in zip(dt.year, dt.month, dt.day)])
Desde la versión 0.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 un datetime.date
dtype, si desea tener un datetime64
entonces puede simplemente normalize
el componente de tiempo hasta la medianoche, de modo que establezca todos los valores en 00:00:00
:
df[''normalised_date''] = df[''dates''].dt.normalize()
Esto mantiene el dtype como datetime64
pero la pantalla muestra solo el valor de la date
.
Esta es una forma simple de extraer la fecha:
import pandas as pd
d=''2015-01-08 22:44:09''
date=pd.to_datetime(d).date()
print(date)
Mientras subí la respuesta de EdChum, que es la respuesta más directa a la pregunta que planteó OP, en realidad no resuelve el problema de rendimiento (todavía depende de los objetos datetime
python, y por lo tanto, cualquier operación sobre ellos no se vectorizará, es decir, será lento).
Una alternativa de mejor rendimiento es usar df[''dates''].dt.floor(''d'')
. Estrictamente hablando, no "mantiene solo la parte de la fecha", ya que solo establece el horario a las 00:00:00
. Pero funciona como lo desea el OP cuando, por ejemplo:
- impresión en pantalla
- guardar 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 los pandas
no escriben el tiempo en csv si son 00:00:00
para todas las observaciones".
Pandas DatetimeIndex
y Series
tienen un método llamado normalize
que hace exactamente lo que usted desea.
Puedes leer más sobre esto en esta respuesta .
se escribirá como ser.dt.normalize()