web-dev-qa-db-ja.com

Pythonの文字列から日付を抽出する

「monkey 2010-07-10 love banana」などの文字列から日付を抽出するにはどうすればよいですか?ありがとう!

62
dmpop

日付が固定形式で指定されている場合は、正規表現を使用して日付を抽出し、「datetime.datetime.strptime」を使用して日付を解析できます。

match = re.search(r'\d{4}-\d{2}-\d{2}', text)
date = datetime.strptime(match.group(), '%Y-%m-%d').date()

それ以外の場合、日付が任意の形式で指定されていると、簡単に抽出できません。

57
lunaryorn

python-dateutil を使用:

In [1]: import dateutil.parser as dparser

In [18]: dparser.parse("monkey 2010-07-10 love banana",fuzzy=True)
Out[18]: datetime.datetime(2010, 7, 10, 0, 0)

無効な日付はValueErrorを発生させます:

In [19]: dparser.parse("monkey 2010-07-32 love banana",fuzzy=True)
# ValueError: day is out of range for month

多くの形式の日付を認識できます。

In [20]: dparser.parse("monkey 20/01/1980 love banana",fuzzy=True)
Out[20]: datetime.datetime(1980, 1, 20, 0, 0)

日付があいまいな場合は推測することに注意してください。

In [23]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True)
Out[23]: datetime.datetime(1980, 10, 1, 0, 0)

ただし、あいまいな日付を解析する方法はカスタマイズ可能です。

In [21]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True, dayfirst=True)
Out[21]: datetime.datetime(1980, 1, 10, 0, 0)
129
unutbu

Pythonの文字列から日付を抽出します。利用可能な最良のモジュールは datefinder モジュールです。

以下の簡単な手順に従って、Pythonプロジェクトで使用できます。

ステップ1:datefinderパッケージをインストールする

pip install datefinder

ステップ2:プロジェクトで使用する

import datefinder

input_string = "monkey 2010-07-10 love banana"
# a generator will be returned by the datefinder module. I'm typecasting it to a list. Please read the note of caution provided at the bottom.
matches = list(datefinder.find_dates(input_string))

if len(matches) > 0:
    # date returned will be a datetime.datetime object. here we are only using the first match.
    date = matches[0]
    print date
else:
    print 'No dates found'

注:多数の一致が予想される場合;リストへの型キャストは、パフォーマンスのオーバーヘッドが大きくなるため推奨されません。

16
Finny Abraham

Pygrokを使用すると、正規表現構文の抽象化された拡張を定義できます。

カスタムパターンは、_%{PATTERN_NAME}_形式で正規表現に含めることができます。

コロンで区切ることにより、そのパターンのラベルを作成することもできます:_%s{PATTERN_NAME:matched_string}_。パターンが一致する場合、結果の辞書の一部として値が返されます(例:result.get('matched_string')

例えば:

_from pygrok import Grok

input_string = 'monkey 2010-07-10 love banana'
date_pattern = '%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day}'

grok = Grok(date_pattern)
print(grok.match(input_string))
_

結果の値は辞書になります:

_{'month': '07', 'day': '10', 'year': '2010'}_

Date_patternがinput_stringに存在しない場合、戻り値はNoneになります。対照的に、パターンにラベルがない場合、空の辞書_{}_が返されます

参照:

1
Aubrey Lavigne