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.