Python dateutil.parser.parse analiza el mes primero, no el día

Estoy usando dateutil.parser.parse para formatear una fecha a partir de una cadena. Pero ahora se mezcla el mes y el día.

Tengo una cadena que contiene 05.01.2015 . Después

 dateutil.parser.parse("05.01.2015") 

vuelve:

 datetime.datetime(2015, 5, 1, 0, 0) 

Esperaba que volviera (2015, 1, 5, 0, 0)

¿Cómo puedo decirle al código que el formato es dd.mm.yyyy ?

Para el registro, el 25.01.2015 se analizará como (2015, 1, 25, 0, 0) , como se esperaba.

Especifique dayfirst=True :

 >>> dateutil.parser.parse("05.01.2015", dayfirst=True) datetime.datetime(2015, 1, 5, 0, 0) 

Esto le da prioridad al formato DD-MM-YYYY en lugar de MM-DD-YYYY en los casos en que el formato de la fecha es ambiguo (por ejemplo, cuando el día es 12 o menos). La función está documentada aquí .

Preguntó: ‘¿Cómo puedo saber el código que el formato es dd.mm.yyyy?’

Dado que ya ha importado dateutil , la respuesta más directa podría ser especificar el formato de la cadena de fecha, pero este es un código bastante feo:

 >>> dateutil.parser.datetime.datetime.strptime(date_string, '%d.%m.%Y') datetime.datetime(2015, 1, 5, 0, 0) 

Podemos ver una alternativa obvia incrustada en el código. Podrías usar eso directamente.

 >>> from datetime import datetime >>> datetime.strptime(date_string, '%d.%m.%Y') datetime.datetime(2015, 1, 5, 0, 0) 

También hay algunas bibliotecas alternativas más nuevas que ofrecen métodos y propiedades en abundancia.

Más simple de usar en este caso sería la arrow :

 >>> import arrow >>> arrow.get(date_string, 'DD.MM.YYYY')  

Aunque me parece que el formato para la flecha es más fácil de recordar, el péndulo utiliza el antiguo sistema de formato de Python, lo que podría ahorrarle tener que aprender a utilizar las flechas.

 >>> import pendulum >>> pendulum.datetime.strptime(date_string, '%d.%m.%Y')