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

m / d /yを処理するようにrootの回答を変更します。

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

y / m/dを優先する年初のオプションもあります。

于 2014-11-07T04:36:47.960 に答える