Python dateutil.analyseur.analyser analyse le premier mois, pas le jour

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

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

dateutil.parser.parse("05.01.2015")

renvoie:

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

j'espère que le il serait de retour (2015, 1, 5, 0, 0)

Comment puis-je dire au code que le format est <!--5?

Pour l'enregistrement, 25.01.2015 va être analysée comme (2015, 1, 25, 0, 0), comme prévu.

18
demandé sur Alex Riley 2015-01-06 17:29:02

2 réponses

Spécifier dayfirst=True:

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

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

29
répondu Alex Riley 2015-01-06 14:30:59

vous avez demandé, ' Comment puis-je dire au code que le format est dd.mmm.yyyy?'

Puisque vous avez déjà importé dateutil ensuite, la plupart des direct réponse peut être pour spécifier le format de la chaîne de date, mais c'est assez moche code:

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

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

il y a aussi quelques nouvelles bibliothèques alternatives qui offrent des méthodes et des propriétés en abondance.

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 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]>
2
répondu Bill Bell 2017-06-15 17:21:03