Разбор даты, которая может быть в нескольких форматах в python
Я хотел бы проанализировать дату, которая может появиться в нескольких форматах, которые я знаю заранее. Если бы я не мог разобрать, я возвращаю нуль. В рубине мне это нравится:
DATE_FORMATS = ['%m/%d/%Y %I:%M:%S %p', '%Y/%m/%d %H:%M:%S', '%d/%m/%Y %H:%M', '%m/%d/%Y', '%Y/%m/%d']
def parse_or_nil(date_str)
parsed_date = nil
DATE_FORMATS.each do |f|
parsed_date ||= DateTime.strptime(date_str, f) rescue nil
end
parsed_date
end
Это краток и работает. Как я могу сделать то же самое в Python?
Ответы
Ответ 1
Вы можете использовать try/except
, чтобы поймать ValueError
, который возникнет при попытке использовать несоответствующий формат. Как упоминает @Bakuriu, вы можете остановить итерацию, когда найдете совпадение, чтобы избежать ненужного синтаксического анализа, а затем определите свое поведение, когда my_date
не определяется, поскольку найдены несоответствующие форматы:
Вы можете использовать try/except
, чтобы поймать ValueError
, который возникнет при попытке использовать несоответствующий формат:
from datetime import datetime
DATE_FORMATS = ['%m/%d/%Y %I:%M:%S %p', '%Y/%m/%d %H:%M:%S', '%d/%m/%Y %H:%M', '%m/%d/%Y', '%Y/%m/%d']
test_date = '2012/1/1 12:32:11'
for date_format in DATE_FORMATS:
try:
my_date = datetime.strptime(test_date, date_format)
except ValueError:
pass
else:
break
else:
my_date = None
print my_date # 2012-01-01 12:32:11
print type(my_date) # <type 'datetime.datetime'>
Ответ 2
Я просто попробую dateutil. Он может распознавать большинство форматов:
from dateutil import parser
parser.parse(string)
если вы в конечном итоге используете datetime.strptime, как предложено @RocketDonkey:
from datetime import datetime
def func(s,flist):
for f in flist:
try:
return datetime.strptime(s,f)
except ValueError:
pass
Ответ 3
После вашего совета, RocketDonkey и одного из Bakuriu, я мог бы написать более короткую версию. Любая проблема с этим?
def parse_or_none(date):
for date_format in DATE_FORMATS:
try:
return datetime.strptime(date, date_format)
except ValueError:
pass
return None
Ответ 4
Изменение корневого ответа на дескриптор m/d/y:
from dateutil import parser
parser.parse(string, dayfirst=False)
Кроме того, есть опция yearfirst, чтобы выбрать y/m/d.