コンテンツにスキップ

日付型/時間型への変換

ja-timexでは、2通りの方法でPythonの日付型/時間型への変換ができます。

  • to_datetime(): datetimeの変換
  • to_duration(): timedeltaへの変換

各表現からの日付型/時間型への変換は以下の通りです。

to_datetime() to_datetime() + 基準日時 to_duration()
日付表現 DATE -
時間表現 TIME - -
持続時間表現 DURATION -
頻度集合表現 SET - - -

なお曜日および西暦の表現は、datetimeでの表現が不可能なためto_datetime()で変換することができません。

基本的な変換

日付表現のdatetimeへの変換

日付表現は、TIMEXクラスからPythonのdatetimeオブジェクトに変換することができます。

In []: timex_parser.parse("2021年7月18日")[0].to_datetime()
Out[]: DateTime(2021, 7, 18, 0, 0, 0, tzinfo=Timezone('Asia/Tokyo'))

日付表現で不足している情報があった場合、yearは実行時の年、monthおよびday1が補完されます。

In []: timex_parser.parse("7月18日")[0].to_datetime()
Out[]: DateTime(2021, 7, 18, 0, 0, 0, tzinfo=Timezone('Asia/Tokyo'))

to_datetime()メソッドの引数tzでタイムゾーンを設定することができます。初期値はAsia/Tokyoです。

In []: timex_parser.parse("2021年7月18日")[0].to_datetime(tz="UTC")
Out[]: DateTime(2021, 7, 18, 0, 0, 0, tzinfo=Timezone('UTC'))

持続時間表現のtimedeltaへの変換

持続時間表現は、TIMEXクラスからPythonのtimedeltaオブジェクトに変換することができます。

In []: timex_parser.parse("1時間前")[0].to_duration()
Out[]: Duration(hours=1)

Tips

ja-timexではpendulumというdatetimeの扱いを容易するパッケージを利用しています。pendulumは基本的にPythonのdatetime/timedeltaを継承して実装されており、互換性があります。

基準日時と補完

TimexParserクラスには基準日時(Reference datetime)を設定することができます。これによりTIMEXクラスにおける日付や期間への変換において、表層表現からは判定することができない情報を補完します。解析対象の文書が書かれた日時が既知の場合において、明示的に基準日時を指定することで、より情報を付加した状態の日付/時間抽出が可能になります。

基準日時の設定

TimexParserクラスのreference引数にpendulumDateTimeインスタンスを指定します。

import pendulum
from ja_timex import TimexParser

timex_parser = TimexParser(reference=pendulum.datetime(2010, 7, 18, tz="Asia/Tokyo"))

基準日時による日付/時刻表現の補完

日付や時間の解析では、Pythonの日付型/時間型に変換するto_datetime()メソッドにおいて、基準日時を元にして補完されます。

例として、2010年7月18日を基準日時としたときに、12月30日という文字列を解析します。

In []: timexes = timex_parser.parse("12月30日")

In []: timexes[0]
Out[]: <TIMEX3 tid="t0" type="DATE" value="XXXX-12-30" text="12月30日">

In []: timexes[0].to_datetime()
Out[]: DateTime(2010, 12, 30, 0, 0, 0, tzinfo=Timezone('Asia/Tokyo'))

TIMEXクラスのvalueには基準日時に関係なく表層表現による値が入りますが、to_datetime()メソッドでdatetimeに変換した際には基準日時の2010年が補完されます。

基準日時による期間表現のdatetimeへの変換

期間表現の解析では、基準日時が設定されていない場合にはPythonの日付型/時間型にto_duration()メソッドのみで変換できますが、設定されている場合にはto_datetime()メソッドによって期間を考慮した変換も可能になります。

例として、2021年7月18日を基準日時としたときに、1日前という文字列を解析します。

In []: timex_parser = TimexParser(reference=pendulum.datetime(2021, 7, 18, tz="Asia/Tokyo"))

In []: timex_parser.parse("1日前")[0].to_duration()
Out[]: Duration(days=1)

In []: timex_parser.parse("1日前")[0].to_datetime()
Out[]: DateTime(2021, 7, 17, 0, 0, 0, tzinfo=Timezone('Asia/Tokyo'))

以上のように、2021年7月18日の1日前である2021年7月17日が返ります。

一方、基準日時を設定していない場合には、to_datetime()メソッドでは下記のようにNoneが返ります。

In []: timex_parser = TimexParser()

In []: timex_parser.parse("1日前")[0].to_duration()
Out[]: Duration(days=1)

In []: timex_parser.parse("1日前")[0].to_datetime()
# None