На всякий случай этот ответ помогает кому-то другому - я пришел сюда, думая, что у меня возникла проблема с нулевым заполнением, но на самом деле это было связано с 12:00 и 00:00 и форматом %I
.
Формамер %I
предназначен для соответствия 12-часовым часам, необязательно с нулевой прокладкой. Но в зависимости от источника данных, вы можете получить данные, говорит, что в полночь или полдень фактически равна нулю, например:
>>> 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'
Что strptime
на самом деле хотел было 12, а не ноль:
>>> datetime.strptime('2015/01/01 12:12am', "%Y/%m/%d %I:%M%p")
datetime.datetime(2015, 1, 1, 0, 12)
Но мы не всегда контролируем наши источники данных! Мое решение для этого края случае было поймать исключение, попробуйте разбор его с %H
, с быстрой проверки, что мы находимся в случае края мы думаем, мы находимся в.
def get_datetime(string):
try:
timestamp = datetime.strptime(string, "%m/%d/%Y %I:%M%p")
except ValueError:
# someone used zero for midnight?
timestamp = datetime.strptime(string, "%m/%d/%Y %H:%M%p")
assert string.lower().endswith('am')
assert timestamp.hour == 0
return timestamp
'0:12 am' недействителен вход. Это должно быть «12:12 утра». '11:59 pm' сопровождается' 12:00 am', а не '0:00 am'. Может быть множество способов подачи данных в неправильный формат времени, например, вход может использовать двухзначный год ('% y') вместо четырехзначного года ('% Y') или день/месяц может быть заменен (' % m /% d' против '% d /% m') и т. д. Случай день/месяц может быть неоднозначным, например,« 2015/10/12 »- это« 12 октября »или« 10 декабря »? btw, вы должны использовать '% Y /% m /% d' вместо'% m /% d /% Y', чтобы соответствовать вашему входному формату. – jfs
Спасибо, я понимаю, что это недопустимый ввод, как я уже сказал, он исходит из источника данных, который я не контролирую. – hwjp