Nur für den Fall, dass diese Antwort jemand anderem hilft - ich kam hierher und dachte, ich hätte ein Problem mit Null-Polsterung, aber es hatte eigentlich mit 12:00 vs 00:00 und dem %I
Formatierer zu tun .
Der %I
Formatierer soll 12-Stunden-Stunden entsprechen, optional mit Nullen aufgefüllt. Abhängig von Ihrer Datenquelle erhalten Sie möglicherweise Daten, die besagen, dass Mitternacht oder Mittag tatsächlich Null ist, z.
>>> datetime.strptime('2015/01/01 0:12am', "%Y/%m/%d %I:%M%p")
ValueError: time data '2015/01/01 0:12am' does not match format '%Y/%m/%d %I:%M'
Was strptime
eigentlich wollte, war eine 12, keine Null:
>>> datetime.strptime('2015/01/01 12:12am', "%Y/%m/%d %I:%M%p")
datetime.datetime(2015, 1, 1, 0, 12)
Wir kontrollieren aber nicht immer unsere Datenquellen! Meine Lösung für diesen Randfall bestand darin, die Ausnahme abzufangen und sie mit a zu analysieren %H
, wobei schnell überprüft wurde, ob wir uns in dem Randfall befinden, in dem wir uns befinden.
def get_datetime(string):
try:
timestamp = datetime.strptime(string, "%m/%d/%Y %I:%M%p")
except ValueError:
timestamp = datetime.strptime(string, "%m/%d/%Y %H:%M%p")
assert string.lower().endswith('am')
assert timestamp.hour == 0
return timestamp
0:12am
ist eine ungültige Eingabe. Es sollte sein12:12am
.11:59 pm
wird gefolgt von12:00 am
nicht0:00am
. Es gibt verschiedene Möglichkeiten, Daten in einem falschen Zeitformat bereitzustellen, z. B. kann die Eingabe ein zweistelliges Jahr (%y
) anstelle eines vierstelligen Jahres (%Y
) verwenden oder ein Tag / Monat kann ausgetauscht werden (%m/%d
vs.%d/%m
) usw. Der Tag / Der Fall eines Monats kann mehrdeutig sein, z. B.2015/10/12
"12. Oktober" oder "10. Dezember"? Übrigens sollten Sie%Y/%m/%d
anstelle von verwenden%m/%d/%Y
, um Ihr Eingabeformat anzupassen .