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'

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

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

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)

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.


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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.