今川館

都内勤務の地味OLです

python-dateutilの使い方

pythonの日付処理モジュールとしてdatetimeパッケージがあるが、dateutilパッケージのモジュールがもっと色々面倒を見てくれるのでちょっと調べてみた。

dateutilがやってくれること

沢山あるけど以下、わたしが使いたいと思った機能を抜粋。

  1. 月末を算出してくれる。
  2. 「次の◯曜日」を算出してくれる。
  3. 「当月の最終◯曜日」を算出してくれる。
  4. ISO-8601形式の日付文字列をdatetimeに変換してくれる。

月末の算出

月初の算出はdatetime.timedeltaでも簡単にできる。

from datetime import timedelta, date
date(2011, 11, 26) + timedelta(day=1)
#=> date(2011, 11, 1)

しかし月末を算出する直接の方法がtimedeltaにない。
dateutilのrelativedeltaだとこれが存在する。

from dateutil.relativedelta import relativedelta
from datetime import date
date(2011, 11, 26) + relativedelta(day=31)
#=> date(2011, 11, 30)
# ちゃんと月末の30日を返す。

次の○曜日

timedeltaのコンストラクタが受け付ける引数は少ない。
例えばdateutilには曜日を表すweekdayという引数を受け付けるが、timedeltaは受け付けない。

weekday引数を使うと「次の火曜日」を簡単に算出できる。
また、火曜日にrelativedeltaを足しても同日を返す。

from datetime import date
import calendar
from dateutil.relativedelta import relativedelta
date(2011, 11, 21) + relativedelta(weekday=calendar.TUESDAY)
#=> date(2011, 11, 22)

# 火曜日
date(2011, 11, 22) + relativedelta(weekday=calendar.TUESDAY)
#=> date(2011, 11, 22)

当月の最終◯曜日

dateutil.relativedeltaには曜日計算用のオブジェクト(FR[=FRIDAY]とか)が用意されている。
これを使うと「当月の最後の金曜日」などを算出できる。

from datetime import date
from dateutil.relativedelta import relativedelta, FR
first_day = date(2011, 11, 1)
rdl = relativedelta(day=31, weekday=FR(-1))
first_day + rdl
#=> date(2011, 11, 25)

ISO-8601形式の日付文字列の変換

以下のようなISO-8601の日付文字列をdatetimeインスタンスに変換するパーサが用意されている。

import dateutil.parser
dateutil.parser.parse("2011-12-03T18:00:00+09:00")
#=> datetime.datetime(2011, 12, 3, 18, 0, tzinfo=tzoffset(None, 32400))

iso8601というモジュールもある

iso8601の日付を処理する専用のモジュールも存在するようだ。
iso8601 0.1.10 : Python Package Index