Pregunta ¿Pueden los pandas reconocer automáticamente las fechas?


Hoy me sorprendió positivamente el hecho de que, al leer datos de un archivo de datos (por ejemplo), los pandas puedan reconocer tipos de valores:

df = pandas.read_csv('test.dat', delimiter=r"\s+", names=['col1','col2','col3'])

Por ejemplo, se puede verificar de esta manera:

for i, r in df.iterrows():
    print type(r['col1']), type(r['col2']), type(r['col3'])

En particular, entero, los flotantes y las cadenas se reconocieron correctamente. Sin embargo, tengo una columna que tiene fechas en el siguiente formato: 2013-6-4. Estas fechas se reconocieron como cadenas (no como objetos de fecha Python). ¿Hay alguna forma de "aprender" pandas en fechas reconocidas?


73
2017-07-04 08:08


origen


Respuestas:


Deberías agregar parse_dates=True, o parse_dates=['column name'] al leer, suele ser suficiente para analizarlo mágicamente. Pero siempre hay formatos extraños que deben definirse manualmente. En tal caso, también puede agregar una función de analizador de fecha, que es la forma más flexible posible.

Supongamos que tiene una columna 'datetime' con su cadena, luego:

dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')

df = pd.read_csv(infile, parse_dates=['datetime'], date_parser=dateparse)

De esta manera, incluso puede combinar varias columnas en una sola columna de fecha y hora, esto combina una columna 'fecha' y una columna 'hora' en una única columna 'fecha y hora':

dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')

df = pd.read_csv(infile, parse_dates={'datetime': ['date', 'time']}, date_parser=dateparse)

165
2017-07-04 10:32



Tal vez la interfaz de pandas ha cambiado desde @Rutger respondió, pero en la versión que estoy usando (0.15.2), el date_parser función recibe una lista de fechas en lugar de un solo valor. En este caso, su código debe actualizarse así:

dateparse = lambda dates: [pd.datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in dates]

df = pd.read_csv(infile, parse_dates=['datetime'], date_parser=dateparse)

13
2018-03-11 16:03



El método pandas read_csv es ideal para analizar las fechas. Documentación completa en http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html

incluso puede tener las diferentes partes de fecha en diferentes columnas y pasar el parámetro:

parse_dates : boolean, list of ints or names, list of lists, or dict
If True -> try parsing the index. If [1, 2, 3] -> try parsing columns 1, 2, 3 each as a
separate date column. If [[1, 3]] -> combine columns 1 and 3 and parse as a single date
column. {‘foo’ : [1, 3]} -> parse columns 1, 3 as date and call result ‘foo’

La detección de fechas predeterminada funciona muy bien, pero parece estar sesgada hacia los formatos de fecha norteamericanos. Si vives en otra parte, es posible que los resultados te atrapen de vez en cuando. Por lo que puedo recordar 1/6/2000 significa el 6 de enero en los Estados Unidos en lugar del 1 de junio donde vivo. Es lo suficientemente inteligente como para cambiarlos si se usan fechas como 23/6/2000. Sin embargo, probablemente sea más seguro quedarse con las variaciones de fecha AAAAMMDD. Disculpas a los desarrolladores de pandas, pero no lo he probado con fechas locales recientemente.

puede usar el parámetro date_parser para pasar una función y convertir su formato.

date_parser : function
Function to use for converting a sequence of string columns to an array of datetime
instances. The default uses dateutil.parser.parser to do the conversion.

10
2017-07-04 10:38



Sí, según el pandas.read_csv  documentación:

Nota: existe una ruta rápida para iso8601-formateado fechas.

Entonces, si su csv tiene una columna llamada datetime y las fechas se ven como 2013-01-01T01:01 por ejemplo, ejecutar esto hará que los pandas (estoy en v0.19.2) recojan la fecha y la hora automáticamente:

df = pd.read_csv('test.csv', parse_dates=['datetime'])

Tenga en cuenta que debe pasar explícitamente parse_dates, no funciona sin.

Verificar con:

df.dtypes

Debería ver que el tipo de datos de la columna es datetime64[ns]


5
2018-04-10 02:46



Al fusionar dos columnas en una única columna de fecha y hora, la respuesta aceptada genera un error (pandas versión 0.20.3), ya que las columnas se envían a la función date_parser por separado.

Los siguientes trabajos:

def dateparse(d,t):
    dt = d + " " + t
    return pd.datetime.strptime(dt, '%d/%m/%Y %H:%M:%S')

df = pd.read_csv(infile, parse_dates={'datetime': ['date', 'time']}, date_parser=dateparse)

5
2017-10-25 08:54



Podrías usar pandas.to_datetime() como se recomienda en la documentación para pandas.read_csv():

Si una columna o índice contiene una fecha indescomercial, toda la columna   o el índice se devolverá inalterado como un tipo de datos de objeto. por   análisis de fecha y hora no estándar, uso pd.to_datetimedespués pd.read_csv.

Manifestación:

>>> D = {'date': '2013-6-4'}
>>> df = pd.DataFrame(D, index=[0])
>>> df
       date
0  2013-6-4
>>> df.dtypes
date    object
dtype: object
>>> df['date'] = pd.to_datetime(df.date, format='%Y-%m-%d')
>>> df
        date
0 2013-06-04
>>> df.dtypes
date    datetime64[ns]
dtype: object

3
2017-09-24 12:52