Python の dateutil で柔軟に日付をパース・操作する

dateutil は Python の日時処理を強力に拡張するサードパーティライブラリです。標準ライブラリでは面倒な処理も、dateutil を使えば簡潔に書けます。

インストール

pip でインストールできます。

pip install python-dateutil

parser:柔軟な日付パース

dateutil.parser は、さまざまな形式の日付文字列を自動で解析してくれます。

from dateutil import parser

# いろいろな形式を自動認識
print(parser.parse("2025-01-15"))
print(parser.parse("January 15, 2025"))
print(parser.parse("15/01/2025"))
print(parser.parse("2025年1月15日"))

strptime() のように書式を指定する必要がなく、人間が書いた日付文字列をそのまま解析できます。ログファイルや自然言語に近い入力を扱う場面で重宝します。

ただし曖昧な形式には注意が必要です。

from dateutil import parser

# 01/02/2025 は 1月2日? 2月1日?
dt = parser.parse("01/02/2025")
print(dt)  # 2025-01-02 00:00:00(デフォルトは月/日/年)

# 日/月/年として解釈させる
dt = parser.parse("01/02/2025", dayfirst=True)
print(dt)  # 2025-02-01 00:00:00

dayfirst=Trueyearfirst=True で解釈の優先順位を指定できます。

relativedelta:月や年の加減算

標準の timedelta では月や年を扱えませんが、relativedelta なら可能です。

from datetime import date
from dateutil.relativedelta import relativedelta

today = date(2025, 1, 15)

# 1ヶ月後
print(today + relativedelta(months=1))  # 2025-02-15

# 1年後
print(today + relativedelta(years=1))  # 2026-01-15

# 3ヶ月と5日前
print(today - relativedelta(months=3, days=5))  # 2024-10-10

月末の扱いも賢くしてくれます。

from datetime import date
from dateutil.relativedelta import relativedelta

# 1月31日の1ヶ月後は?
d = date(2025, 1, 31)
print(d + relativedelta(months=1))  # 2025-02-28

2月には31日がないため、自動的に月末の28日に調整されます。

2つの日付の差を詳細に取得

relativedelta は2つの日付の差を年・月・日で分解して返すこともできます。

from datetime import date
from dateutil.relativedelta import relativedelta

birth = date(1990, 5, 20)
today = date(2025, 1, 15)

delta = relativedelta(today, birth)
print(f"{delta.years}{delta.months}ヶ月 {delta.days}")
# 34歳 7ヶ月 26日

年齢計算や勤続年数の表示に便利です。

rrule:繰り返しルールの生成

rrule は iCalendar の繰り返しルール(RRULE)に対応した日付生成機能です。

from datetime import date
from dateutil.rrule import rrule, MONTHLY, MO

# 2025年の毎月第2月曜日
rule = rrule(
    MONTHLY,
    byweekday=MO(2),
    dtstart=date(2025, 1, 1),
    count=12
)

for dt in rule:
    print(dt.date())

定期的なスケジュール生成や、カレンダーアプリのリピート機能実装に使えます。

tz:タイムゾーン操作

dateutil.tz はタイムゾーンの取り扱いを簡単にします。

from datetime import datetime
from dateutil import tz

# タイムゾーンを取得
jst = tz.gettz("Asia/Tokyo")
utc = tz.UTC

# 現在時刻を JST で取得
now_jst = datetime.now(jst)
print(now_jst)

# UTC に変換
now_utc = now_jst.astimezone(utc)
print(now_utc)

Python 3.9 以降は標準の zoneinfo モジュールも使えますが、dateutil.tz はそれ以前のバージョンでも動作します。

いつ dateutil を使うべきか

標準ライブラリで十分なケースもありますが、以下の場合は dateutil の導入を検討してください。

月や年の加減算

timedelta では扱えない。relativedelta を使う。

柔軟な日付パース

書式が不定のユーザー入力を扱う場合。parser で自動解析できる。

依存ライブラリを増やしたくない場合は標準ライブラリで頑張ることもできますが、日時処理が多いプロジェクトでは dateutil を入れておくと開発効率が上がります。