Pythonのライブラリを使って祝日の一覧を得る

最近のとあるタスクで、祝日の一覧が必要なことがありました。まぁ、たかだか1年分くらいの祝日であれば検索して出てきたカレンダーとかから転記しても良いですし、今の時代ならChatGPTに頼めばPythonで使える配列で実装してくれるでしょう。

ただ、Pythonのライブラリで専用のものがあることもわかり、使い方を確認したので記録しておきます。

使用するライブラリは workalendar です。ドキュメントはこちら

これは世界中の国の祝祭日を扱えるライブラリで、その中で日本の祝祭日も一覧を得たり判定したりできます。

ドキュメントの Basic Usageのページにフランスの事例が載っているのでそれを真似しながら日本の祝日の一覧を取ってみましょう。年を指定して実行しますが2025年を使います。

from workalendar.asia import Japan


cal = Japan()
cal.holidays(2025)
"""
[(datetime.date(2025, 1, 1), 'New year'),
 (datetime.date(2025, 1, 13), 'Coming of Age Day'),
 (datetime.date(2025, 2, 11), 'Foundation Day'),
 (datetime.date(2025, 2, 23), "The Emperor's Birthday"),
 (datetime.date(2025, 3, 20), 'Vernal Equinox Day'),
 (datetime.date(2025, 4, 29), 'Showa Day'),
 (datetime.date(2025, 5, 3), 'Constitution Memorial Day'),
 (datetime.date(2025, 5, 4), 'Greenery Day'),
 (datetime.date(2025, 5, 5), "Children's Day"),
 (datetime.date(2025, 7, 21), 'Marine Day'),
 (datetime.date(2025, 8, 11), 'Mountain Day'),
 (datetime.date(2025, 9, 15), 'Respect-for-the-Aged Day'),
 (datetime.date(2025, 9, 23), 'Autumnal Equinox Day'),
 (datetime.date(2025, 10, 13), 'Sports Day'),
 (datetime.date(2025, 11, 3), 'Culture Day'),
 (datetime.date(2025, 11, 23), 'Labour Thanksgiving Day')]
"""

このように一覧が簡単に出力できます。

ただ、注意しないといけないのは振替休日に対応してなさそうな点です。2025/02/23 は上記の結果の通り天皇誕生日ですが、日曜日なので2025/02/24が振替休日でした。しかしこれはリストには入っていません。

次に、これを使うとある日が平日(営業日)なのかのどうかの判定ができます。これはis_working_day()メソッドを使います。

日曜でも祝日でもなければTrueが帰ってきます。

from datetime import datetime
from datetime import timedelta


start_day = datetime(2025, 2, 10)
for i in range(15):
    target_day = start_day + timedelta(days=i)
    if cal.is_working_day(target_day):
        print(f"{target_day} は平日です。")
    else:
        print(f"{target_day} は平日ではありません。")
"""
2025-02-10 00:00:00 は平日です。
2025-02-11 00:00:00 は平日ではありません。
2025-02-12 00:00:00 は平日です。
2025-02-13 00:00:00 は平日です。
2025-02-14 00:00:00 は平日です。
2025-02-15 00:00:00 は平日ではありません。
2025-02-16 00:00:00 は平日ではありません。
2025-02-17 00:00:00 は平日です。
2025-02-18 00:00:00 は平日です。
2025-02-19 00:00:00 は平日です。
2025-02-20 00:00:00 は平日です。
2025-02-21 00:00:00 は平日です。
2025-02-22 00:00:00 は平日ではありません。
2025-02-23 00:00:00 は平日ではありません。
2025-02-24 00:00:00 は平日です。
"""

上記の通り、建国記念日(2025/02/11)や土日(2/15, 2/16, 2/22, 2/23) はFalseが帰ってきたので平日ではないという結果になっていますね。

ただ、やっぱり振替休日に対応していないので2025/2/24は判定をミスっています。

このほか、営業日のみカウントして特定の日付からn日後の日を求めるといったこともできます。

start_date = datetime(2025, 4, 25)
n_days = 3

workday = cal.add_working_days(start_date, n_days)
print(workday)  # 2025-05-01

4月26,27日は土日で、29日は昭和の日なので、3営業日後の5月1日が得られましたね。

振り返り休日に対応してないってのと、祝祭日に法的な変更が入ったらこまめにバージョンを上げていかないといけないというデメリットはありますが、それ以外では小回りのきくメソッドをいろいろ持っていますので、興味のある方は一度ドキュメントを読んでみてください。