「monkey 2010-07-10 love banana」などの文字列から日付を抽出するにはどうすればよいですか?ありがとう!
日付が固定形式で指定されている場合は、正規表現を使用して日付を抽出し、「datetime.datetime.strptime」を使用して日付を解析できます。
match = re.search(r'\d{4}-\d{2}-\d{2}', text)
date = datetime.strptime(match.group(), '%Y-%m-%d').date()
それ以外の場合、日付が任意の形式で指定されていると、簡単に抽出できません。
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)
Pythonの文字列から日付を抽出します。利用可能な最良のモジュールは datefinder モジュールです。
以下の簡単な手順に従って、Pythonプロジェクトで使用できます。
pip install datefinder
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'
注:多数の一致が予想される場合;リストへの型キャストは、パフォーマンスのオーバーヘッドが大きくなるため推奨されません。
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
になります。対照的に、パターンにラベルがない場合、空の辞書_{}
_が返されます
参照: