Ответ 1
Вы можете использовать блок try/except
:
try:
timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f')
except ValueError:
timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S')
Сейчас у меня есть:
timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f')
Это отлично работает, если я не конвертирую строку, которая не имеет микросекунд. Как я могу указать, что микросекунды являются необязательными (и их следует считать 0, если они не находятся в строке)?
Вы можете использовать блок try/except
:
try:
timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f')
except ValueError:
timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S')
Как просто добавить его, если он не существует?
if '.' not in date_string:
date_string = date_string + '.0'
timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f')
Я предпочитаю использовать регулярные выражения вместо try и except. Это позволяет использовать множество резервных копий приемлемых форматов.
# full timestamp with milliseconds
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z", date_string)
if match:
return datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%S.%fZ")
# timestamp missing milliseconds
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z", date_string)
if match:
return datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%SZ")
# timestamp missing milliseconds & seconds
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z", date_string)
if match:
return datetime.strptime(date_string, "%Y-%m-%dT%H:%MZ")
# unknown timestamp format
return false
Не забывайте импортировать "re", а также "datetime" для этого метода.
datetime(*map(int, re.findall('\d+', date_string)))
может анализировать как '%Y-%m-%d %H:%M:%S.%f'
, так и '%Y-%m-%d %H:%M:%S'
. Это слишком разрешительно, если ваш вход не фильтруется.
Это быстро и грязно, но иногда strptime()
работает слишком медленно. Его можно использовать, если вы знаете, что ввод имеет ожидаемый формат даты.