python-dateutilの使い方
pythonの日付処理モジュールとしてdatetimeパッケージがあるが、dateutilパッケージのモジュールがもっと色々面倒を見てくれるのでちょっと調べてみた。
dateutilがやってくれること
沢山あるけど以下、わたしが使いたいと思った機能を抜粋。
- 月末を算出してくれる。
- 「次の◯曜日」を算出してくれる。
- 「当月の最終◯曜日」を算出してくれる。
- 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