Мы хотим try...catch
несколько форматов даты и времени fmt1,fmt2,...,fmtn
и подавлять / обрабатывать исключения (из strptime
) для всех тех, которые не соответствуют (и, в частности, избегать необходимости в юкки-n-глубокой лестнице с отступом try..catch
положения). Я нашел два элегантных способа, второй лучше вообще. (Это большая проблема для данных реального мира, где множественные, несовпадающие, неполные, несовместимые и многоязычные / региональные форматы даты часто свободно смешиваются в одном наборе данных.)
1) Попробуйте по отдельности применить каждый формат и обработать каждый отдельный strptime()
fail в качестве возвращаемого значения None
, так что вы можете связывать вызовы fn ...
Для начала, адаптируясь из ответа @OrWeis для компактности:
def try_strptime_single_format(s, fmt):
try:
return datetime.datetime.strptime(s, fmt)
except ValueError:
return None
Теперь вы можете вызывать как try_strptime(s, fmt1) or try_strptime(s, fmt2) or try_strptime(s, fmt3) ...
Но мы можем улучшить это до:
2) Применить несколько возможных форматов (либо передать в качестве аргумента, либо использовать разумные значения по умолчанию), выполнить итерацию по ним, перехватить и обработать любые ошибки внутри:
Более чистый, простой и более удобный для OO обобщение, чтобы сделать параметр formats
единственной строкой или списком, а затем выполнить итерацию по этому ..., чтобы ваш вызов сократился до try_strptime(s, [fmt1, fmt2, fmt3, ...])
def try_strptime(s, fmts=['%d-%b-%y','%m/%d/%Y']):
for fmt in fmts:
try:
return datetime.strptime(s, fmt)
except:
continue
return None # or reraise the ValueError if no format matched, if you prefer
(Обратите внимание, что ...finally
- это не тот дроид, который нам нужен, поскольку он будет выполняться после каждого прохода цикла, т. Е. В каждом подходящем формате, а не один раз в конце цикла.)
Я считаю реализацию 2) чище и лучше. В частности, функция / метод может хранить список форматов по умолчанию, что делает его более отказоустойчивым и менее подверженным исключениям в реальных данных. (Мы могли бы даже определить, какие форматы по умолчанию применять, основываясь на других столбцах, например, сначала попробуйте немецкие форматы даты на немецких данных, арабский на арабском, форматы даты и времени в блоге и т.д.).