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 %IFormatierer zu tun .
Der %IFormatierer 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 strptimeeigentlich 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:12amist eine ungültige Eingabe. Es sollte sein12:12am.11:59 pmwird gefolgt von12:00 amnicht0: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/%dvs.%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/%danstelle von verwenden%m/%d/%Y, um Ihr Eingabeformat anzupassen .