web-dev-qa-db-fra.com

Python dateutil.parser.parse analyse le mois en premier, pas le jour

J'utilise dateutil.parser.parse pour formater une date à partir d'une chaîne. Mais maintenant, il confond le mois et le jour.

J'ai une chaîne qui contient 05.01.2015. Après

dateutil.parser.parse("05.01.2015")

il renvoie:

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

J'espérais que ça reviendrait (2015, 1, 5, 0, 0)

Comment puis-je dire au code que le format est dd.mm.yyyy?

Pour mémoire, 25.01.2015 sera analysé comme (2015, 1, 25, 0, 0), comme prévu.

24
Timo002

Spécifiez dayfirst=True:

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

Cela donne la priorité au format JJ-MM-AAAA au lieu de MM-JJ-AAAA dans les cas où le format de la date est ambigu (par exemple lorsque le jour est 12 ou moins). La fonction est documentée ici .

40
Alex Riley

Vous avez demandé: "Comment puis-je dire au code que le format est jj.mm.aaaa?"

Puisque vous avez déjà importé dateutil alors la plupart réponse directe pourrait être de spécifier le format de la chaîne de date mais c'est un code assez laid:

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

Nous pouvons voir une alternative évidente intégrée dans le code. Vous pouvez l'utiliser directement.

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

Il existe également de nouvelles bibliothèques alternatives qui offrent de nombreuses méthodes et propriétés.

Le plus simple à utiliser dans ce cas serait arrow:

>>> import arrow
>>> arrow.get(date_string, 'DD.MM.YYYY')
<Arrow [2015-01-05T00:00:00+00:00]>

Bien que je trouve le formatage pour flèche plus facile à retenir, pendule utilise l'ancien système de formatage de Python qui pourrait vous éviter d'avoir à apprendre les flèches.

>>> import pendulum
>>> pendulum.datetime.strptime(date_string, '%d.%m.%Y')
<Pendulum [2015-01-05T00:00:00+00:00]>
3
Bill Bell