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 .Die Methode ohne Muster ist das Verwendungsmodul
dateutil.parse
, mit dem die gängigen Datumsformate analysiert werden können, auch wenn Sie nicht wissen, was derzeit verwendet wird. Beispiel:
>>> import dateutil.parser >>> >>> utc_time = '2014-08-13T00:00:00' >>> verbose_time = '13-Aug-2014' >>> some_locale = '3/1/2014 9:55' >>> dateutil.parser.parse(utc_time) datetime.datetime(2014, 8, 13, 0, 0) >>> dateutil.parser.parse(verbose_time) datetime.datetime(2014, 8, 13, 0, 0) >>> dateutil.parser.parse(some_locale) datetime.datetime(2014, 3, 1, 9, 55)
quelle
Sie können das Strftime-Dokument hier sehen , aber tatsächlich funktionieren nicht alle auf allen Plattformen gut. Zum Beispiel
%-d,%-m
funktionieren Sie nicht mit Win7 von Python 2.7, also können Sie dies erreichen>>> date_str = '{d.year}-{d.month}-{d.day}'.format(d=datetime.datetime.now()) >>> print(date_str) 2016-5-23
quelle
%#d
,%#m
. Aber sowohl Dash- als auch Hash-Mods werden nur in der String-Formatierung (strftime
) benötigt, nicht in Parsing (strptime
).