2015-06-01 10 views
19

Im Moment habe ich:Python strptime Format mit optionaler Bits

timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f') 

Dies funktioniert gut, wenn ich eine Zeichenfolge bin Umwandlung, die nicht die Mikrosekunden hat. Wie kann ich angeben, dass die Mikrosekunden optional sind (und als 0 betrachtet werden sollten, wenn sie nicht in der Zeichenfolge enthalten sind)?

Antwort

17

Sie könnten einen try/except Block verwenden:

try: 
    timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f') 
except ValueError: 
    timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S') 
9

Was ist es nur anhängt, wenn es gar nicht existiert?

if '.' not in date_string: 
    date_string = date_string + '.0' 

timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f') 
2

Ich bevorzuge Regex-Übereinstimmungen statt versuchen und außer. Dies ermöglicht viele Fallbacks von akzeptablen Formaten.

# full timestamp with milliseconds 
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z", date_string) 
if match: 
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%S.%fZ") 

# timestamp missing milliseconds 
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z", date_string) 
if match: 
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%SZ") 

# timestamp missing milliseconds & seconds 
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z", date_string) 
if match: 
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%MZ") 

# unknown timestamp format 
return false 

Vergessen Sie nicht, "re" sowie "datetime" für diese Methode zu importieren.

0
datetime(*map(int, re.findall('\d+', date_string))) 

können sowohl '%Y-%m-%d %H:%M:%S.%f' und '%Y-%m-%d %H:%M:%S' analysieren. Es ist zu freizügig, wenn Ihre Eingabe nicht gefiltert wird.

Es ist schnell und schmutzig, aber manchmal strptime() ist zu langsam. Es kann verwendet werden, wenn Sie wissen, dass die Eingabe das erwartete Datumsformat hat.

+0

Dies ergibt falsche Ergebnisse, wenn in 'date_string' nachfolgende Nullen aus dem Mikrosekundenteil weggelassen werden. – jez

+1

@jez: Ja, deshalb habe ich gesagt, es sei "zu freizügig". Es funktioniert nur, wenn die Eingabe das erwartete Format hat (keine oder 6 Ziffern für Mikrosekunden). 2- über deine Editierung: schau dir die Frage an: 'datetime' ist die Klasse hier, nicht das Modul. – jfs