我想解析一个可以预先知道的几种格式的日期。如果我无法解析,我会返回零。在红宝石中,我喜欢这样:
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中做同样的事情?
答案 0 :(得分:15)
我会尝试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
答案 1 :(得分:11)
您可以使用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 :(得分: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
答案 3 :(得分:1)
修改root的答案来处理m / d / y:
from dateutil import parser
parser.parse(string, dayfirst=False)
还有一个第一选择,更喜欢y / m / d。