2009-08-11 11 views
16

Ich möchte Daten wie diese in ein Datetime-Objekt analysieren:python datetime strptime Wildcard

  • 12. Dezember 2008
  • 1. Januar 2009

Die folgenden für den ersten Tag arbeiten :

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

aber wegen des Suffix an die Tagesnummer ('st') für die zweite Fail . Also, gibt es ein undokumentiertes Platzhalterzeichen in der Laufzeit? Oder ein besserer Ansatz insgesamt?

Antwort

18

Verwenden Sie das Modul dateutil.parser.

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

Weitere Dokumentation finden Sie hier: http://labix.org/python-dateutil

+0

python-dateutil scheint sich bewegt zu haben. Die Dokumente befinden sich unter https://dateutil.readthedocs.org/en/latest/ und es gibt Links zu deren Github Repo- und Pypi-Seite. – drevicko

7

strptime heikel ist, weil es auf der zugrunde liegenden C-Bibliothek für ihre Umsetzung beruht, so dass einige Details unterscheiden sich von Plattform zu Plattform. Es scheint keine Möglichkeit zu geben, die benötigten Charaktere zu finden. Aber Sie könnten die Daten reinigen zuerst:

# 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

Ich würde mir Sorgen machen, was das mit August zu tun hat. –

+1

Deshalb habe ich das nachgestellte Komma eingefügt. –

+1

Ich würde sagen, dass es besser ist, [\ d] {1,2} vor Ihrem regulären Ausdruck hinzuzufügen. Immerhin wollen Sie Suffixe nach Zahlen abgleichen, oder? :-) – Vince

9

Sie benötigen Gustavo Niemeyers python_dateutil - sobald es installiert ist,

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

Für alle, die, wie ich, nur etwas, das „Werk“ ohne zusätzlichen Modul, das ist eine schnelle und schmutzige Lösung.

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