2009-08-11 21 views
16

Je veux analyser les dates comme celles-ci dans un objet datetime:datetime strptime python joker

  • 12 Décembre, 2008
  • 1er Janvier, 2009

cela devrait fonctionner pour la première date :

datetime.strptime("December 12th, 2008", "%B %dth, %Y") 

mais échouera pour la seconde en raison du suffixe du numéro de jour ('st') . Alors, y a-t-il un caractère générique non documenté dans strptime? Ou une meilleure approche tout à fait?

Répondre

18

Essayez d'utiliser le module dateutil.parser.

import dateutil.parser 
date1 = dateutil.parser.parse("December 12th, 2008") 
date2 = dateutil.parser.parse("January 1st, 2009") 

Des documents supplémentaires peuvent être trouvés ici: http://labix.org/python-dateutil

+0

python-dateutil semble avoir déménagé. Les docs sont à https://dateutil.readthedocs.org/en/latest/ et il y a des liens vers le repo de github et la page de pypi. – drevicko

7

strptime est délicate car elle repose sur la bibliothèque C sous-jacente pour sa mise en œuvre, de sorte que certains détails diffèrent entre les plates-formes. Il ne semble pas y avoir un moyen de faire correspondre les caractères dont vous avez besoin. Mais vous pouvez nettoyer d'abord les données:

# Remove ordinal suffixes from numbers. 
date_in = re.sub(r"(st|nd|rd|th),", ",", date_in) 
# Parse the pure date. 
date = datetime.strptime(date_in, "%B %d, %Y") 
+6

Je serais inquiet de ce que cela va faire pour Août. –

+1

C'est pourquoi j'ai inclus la virgule de fin. –

+1

Je dirais qu'il vaut mieux ajouter [\ d] {1,2} avant votre expression régulière. Après tout, vous voulez faire correspondre les suffixes après les numéros, non? :-) – Vince

9

Vous avez besoin Gustavo Niemeyer python_dateutil - une fois installé,

>>> from dateutil import parser 
>>> parser.parse('December 12th, 2008') 
datetime.datetime(2008, 12, 12, 0, 0) 
>>> parser.parse('January 1st, 2009') 
datetime.datetime(2009, 1, 1, 0, 0) 
>>> 
1

Pour tous ceux qui, comme moi, je veux juste quelque chose qui « fonctionne » sans plus module, c'est une solution rapide et sale.

string_list = ["th", "rd", "nd", "st"] 
time = None 
for str in string_list: 
    if (time is not None): 
     break 
    try: 
     match_string = '%B %d' + str +', %Y' 
     time = datetime.strptime("December 12th, 2008", match_string) 
    except Exception: 
     pass