Especificar el formato de fecha al convertir con pandas.to_datetime

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 importé 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ó fechas inconsistentemente. Para usar mi ejemplo existente, el 12/01/2012 se convertiría como un objeto datetime que representa el 1 de diciembre de 2012, pero el 30/01/2012 se convierte al 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 los mismos. 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 hacer la conversión directamente mientras lee sus datos.
El truco aquí es usar 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 sus fechas están en una columna determinada:

 >>> 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 .

Solo puede especificar el formato para 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, esto no funciona con NaN, si está satisfecho con dayfirst=True (que también funciona con NaN):

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

Cabe destacar 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 .