13

我想解析一个可以有多种格式的日期,我事先知道。如果我无法解析,我返回 nil。在红宝石中,我喜欢这样:

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 中做同样的事情?

4

4 回答 4

19

我只想试试dateutil。它可以识别大多数格式:

from dateutil import parser
parser.parse(string)

如果您最终按照@RocketDonkey 的建议使用 datetime.strptime :

from datetime import datetime

def func(s,flist):
    for f in flist:
        try:
            return datetime.strptime(s,f)
        except ValueError:
            pass
于 2013-01-09T19:42:40.190 回答
12

您可以使用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'>
于 2013-01-09T19:42:16.960 回答
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
于 2013-01-09T21:41:09.477 回答
1

修改 root 的答案以处理 m/d/y:

from dateutil import parser
parser.parse(string, dayfirst=False)

还有一个 yearfirst 选项,更喜欢 y/m/d。

于 2014-11-07T04:36:47.960 回答