working with parse datetimeindex dates python datetime pandas

python - with - Especificando el formato de fecha al convertir con pandas.to_datetime



pandas working with datetime (2)

Tengo datos en un archivo csv con fechas almacenadas como cadenas en un formato estándar del Reino Unido - %d/%m/%Y - lo que significa que se ven así:

12/01/2012 30/01/2012

Los ejemplos anteriores representan el 12 de enero de 2012 y el 30 de enero de 2012.

Cuando importo estos datos con pandas versión 0.11.0 apliqué la siguiente transformación:

import pandas as pd ... cpts.Date = cpts.Date.apply(pd.to_datetime)

pero convirtió las fechas de forma inconsistente. Para usar mi ejemplo actual, 12/01/2012 se convertiría como un objeto de fecha y hora que representa el 1 de diciembre de 2012, pero el 30/01/2012 se convertirá el 30 de enero de 2012, que es lo que quiero.

Después de mirar esta pregunta , intenté:

cpts.Date = cpts.Date.apply(pd.to_datetime, format=''%d/%m/%Y'')

pero los resultados son exactamente iguales. El código fuente sugiere que estoy haciendo las cosas bien, así que estoy perdido. ¿Alguien sabe lo que estoy haciendo mal?


Puede usar la opción parse_dates de read_csv para realizar la conversión directamente mientras lee sus datos.
El truco aquí es utilizar dayfirst=True para indicar que las fechas comienzan con el día y no con el mes. Consulte aquí para obtener más información: http://pandas.pydata.org/pandas-docs/dev/generated/pandas.io.parsers.read_csv.html

Cuando tus fechas tienen que ser el índice:

>>> import pandas as pd >>> from StringIO import StringIO >>> s = StringIO("""date,value ... 12/01/2012,1 ... 12/01/2012,2 ... 30/01/2012,3""") >>> >>> pd.read_csv(s, index_col=0, parse_dates=True, dayfirst=True) value date 2012-01-12 1 2012-01-12 2 2012-01-30 3

O cuando tus fechas están en una cierta columna:

>>> s = StringIO("""date ... 12/01/2012 ... 12/01/2012 ... 30/01/2012""") >>> >>> pd.read_csv(s, parse_dates=[0], dayfirst=True) date 0 2012-01-12 00:00:00 1 2012-01-12 00:00:00 2 2012-01-30 00:00:00


Creo que lo estás llamando correctamente, y publiqué esto como un problema en github .

Puede especificar el formato a to_datetime directamente, por ejemplo:

In [1]: s = pd.Series([''12/1/2012'', ''30/01/2012'']) In [2]: pd.to_datetime(s, format=''%d/%m/%Y'') Out[2]: 0 2012-01-12 00:00:00 1 2012-01-30 00:00:00 dtype: datetime64[ns]

Actualización: Como OP señala correctamente que esto no funciona con NaN, si está satisfecho con dayfirst=True (que también funciona con NaN):

s.apply(pd.to_datetime, dayfirst=True)

Vale la pena señalar que hay que tener cuidado al usar dayfirst (que es más fácil que especificar el formato exacto), ya que dayfirst no es estricto .