Na wypadek, gdyby ta odpowiedź pomogła komuś innemu - przyszedłem tutaj, myśląc, że mam problem z wypełnieniem zerowym, ale tak naprawdę było to z 12:00 vs 00:00 i %I
formatyzatorem.
%I
Formatujący ma pasujące do godziny 12-godzinny zegara, ewentualnie zostaje wypełniony zerami. Ale w zależności od źródła danych możesz otrzymać dane, które mówią, że północ lub południe to w rzeczywistości zero, np .:
>>> 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'
To, czego strptime
tak naprawdę chciał, to 12, a nie zero:
>>> datetime.strptime('2015/01/01 12:12am', "%Y/%m/%d %I:%M%p")
datetime.datetime(2015, 1, 1, 0, 12)
Ale nie zawsze kontrolujemy nasze źródła danych! Moim rozwiązaniem dla tego skrajnego przypadku było złapanie wyjątku, spróbuj przeanalizować go za pomocą %H
, z szybkim sprawdzeniem, czy znajdujemy się w przypadku skrajnym, w którym myślimy, że się znajdujemy.
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
to nieprawidłowe dane wejściowe. Tak powinno być12:12am
.11:59 pm
następuje12:00 am
, nie0:00am
. Może istnieć wiele sposobów dostarczania danych w nieprawidłowym formacie czasu, np. Dane wejściowe mogą zawierać dwucyfrowy rok (%y
) zamiast czterocyfrowego roku (%Y
) lub można zamienić dzień / miesiąc (w%m/%d
porównaniu z%d/%m
) itp. przypadek miesiąca może być niejednoznaczny, np. czy2015/10/12
jest to „12 października” czy „10 grudnia”? btw, powinieneś używać%Y/%m/%d
zamiast,%m/%d/%Y
aby dopasować swój format wejściowy.Możesz zobaczyć dokument strftime tutaj, ale w rzeczywistości nie wszystkie działają dobrze na wszystkich platformach , na przykład ,
%-d,%-m
nie działają na win7 przez pythona 2.7 , więc możesz to zrobić w ten sposób>>> date_str = '{d.year}-{d.month}-{d.day}'.format(d=datetime.datetime.now()) >>> print(date_str) 2016-5-23
źródło
%#d
,%#m
. Ale zarówno mody myślnikowe, jak i haszujące są potrzebne tylko w formatowaniu ciągów (strftime
), a nie w parsowaniu (strptime
).Sposób bez wzorca to
dateutil.parse
moduł use , który pozwala na parsowanie popularnych formatów dat, nawet jeśli nie wiesz, jakich obecnie używaEx:
>>> 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)
źródło