Про всяк випадок, якщо ця відповідь допоможе комусь іншому - я прийшов сюди, думаючи, що маю проблему з нульовим заповненням, але насправді це стосувалося 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:
timestamp = datetime.strptime(string, "%m/%d/%Y %H:%M%p")
assert string.lower().endswith('am')
assert timestamp.hour == 0
return timestamp
0:12amнедійсне введення. Це повинно бути12:12am.11:59 pmслідує12:00 am, а не0:00am. Можуть існувати різні способи подання даних у неправильному часовому форматі, наприклад, для введення може використовуватися двозначний рік (%y) замість чотиризначного рік (%Y) або день / місяць можуть бути помінені місцями (%m/%dпроти%d/%m) тощо. День / місяць може бути неоднозначним, наприклад,2015/10/12це "12 жовтня" чи "10 грудня"? До речі, ви повинні використовувати%Y/%m/%dзамість того,%m/%d/%Yщоб відповідати формату введення.