working with parse datetimeindex dates python datetime pandas

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()