Convertir columna de pandas a fecha y hora

242

Tengo un campo en un DataFrame de pandas que se importó como formato de cadena. Debería ser una variable de fecha y hora. ¿Cómo puedo convertirlo en una columna de fecha y hora y luego filtrar según la fecha?

Ejemplo:

  • Nombre del marco de datos : raw_data
  • Nombre de columna: Mycol
  • Formato del valor en la columna: '05SEP2014: 00: 00: 00.000'
Chris
fuente

Respuestas:

431

Use la to_datetimefunción, especificando un formato para que coincida con sus datos.

raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], format='%d%b%Y:%H:%M:%S.%f')
chrisb
fuente
71
Nota: el formatargumento no es obligatorio. to_datetimees listo. Siga adelante y pruébelo sin tratar de hacer coincidir sus datos.
samthebrand
66
Para evitar el SettingWithCopyWarninguso de @ darth-behfans stackoverflow.com/a/42773096/4487805
Álvaro Loza
3
¿Qué pasa si solo quieres tiempo y no fecha?
FaCoffee
55
No es terriblemente inteligente. Incluso si parte de la columna está inequívocamente en el formato dayfirst = True, seguirá siendo el valor predeterminado de dayfirst = False para las demás en la misma columna. Por lo tanto, es más seguro usar una especificación de formato explícito o al menos el primer parámetro del día.
CPBL
10
Omitir la cadena de formato puede hacer que esta operación sea lenta con muchos registros. Esta respuesta discute por qué. Parece infer_datetime_format=Trueque también podría aumentar la velocidad de análisis hasta ~ 5-10x (según los documentos de pandas) si no incluye una cadena de formato.
atwalsh
52

Puede usar el método DataFrame .apply()para operar los valores en Mycol:

>>> df = pd.DataFrame(['05SEP2014:00:00:00.000'],columns=['Mycol'])
>>> df
                    Mycol
0  05SEP2014:00:00:00.000
>>> import datetime as dt
>>> df['Mycol'] = df['Mycol'].apply(lambda x: 
                                    dt.datetime.strptime(x,'%d%b%Y:%H:%M:%S.%f'))
>>> df
       Mycol
0 2014-09-05
carne_mecánica
fuente
1
¡Gracias! Esto es bueno porque es más ampliamente aplicable, pero la otra respuesta fue más directa. Me costó decidir cuál me gustaba más :)
Chris
2
Me gusta más esta respuesta, porque produce un objeto de fecha y hora en lugar de un objeto
pandas.tslib.Timestamp
25

Si tiene más de una columna para convertir, puede hacer lo siguiente:

df[["col1", "col2", "col3"]] = df[["col1", "col2", "col3"]].apply(pd.to_datetime)
Vlad Bezden
fuente
15
raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], format='%d%b%Y:%H:%M:%S.%f')

funciona, sin embargo, da como resultado una advertencia de Python de que se está intentando establecer un valor en una copia de un segmento de un DataFrame. Intenta usar en su .loc[row_indexer,col_indexer] = valuelugar

Supongo que esto se debe a una indexación de encadenamiento.

Darth BEHFANS
fuente
3
Me tomó algunos intentos, pero esto funciona: raw_data.loc [:, 'Mycol'] = pd.to_datetime (raw_data ['Mycol'], format = '% d% b% Y:% H:% M:% S .% f ')
pinegulf
9

Use la to_datetimefunción de pandas para analizar la columna como DateTime. Además, mediante el uso infer_datetime_format=True, detectará automáticamente el formato y convertirá la columna mencionada a DateTime.

import pandas as pd
raw_data['Mycol'] =  pd.to_datetime(raw_data['Mycol'], infer_datetime_format=True)
Prateek Sharma
fuente