【日本の祝日】Pythonで日本の祝日を判定するライブラリを作ってみた

# はじめに

| オンライン版                                                                                                           | オフライン版                                                                                |
| ---------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| オンラインへの接続必須(日本国内のみ利用可)                                                                             | スタンドアロンで動作                                                                        |
| ![online](https://img.shields.io/endpoint?url=https%3A%2F%2Fpublic.flarebrow.com%2Fjapanholiday-badge.json?ver=2026) | ![offline](https://img.shields.io/badge/supported-1980/01/01%20%EF%BD%9E%202026/12/31-blue) |
| 範囲外の日時はオフライン版で動作                                                                                       | 範囲外でも動作OK。但し、内容が正確でない場合あり                                            |
| 営業日：OK                                                                                                             | 営業日：OK                                                                                  |

<b>この記事はChatGPTとBingが執筆しています。文章が怪しいところがあるので、少しずつ修正していきます。</b>

日本の祝日を取得するためのPythonライブラリはいくつか存在しますが、正確に取得できるものはないという課題がありました。そこで、私はPython 3.9以降で動作するシンプルな祝日判定ライブラリを作成してみました。

このライブラリでは、モデルなどの複雑な仕組みを使わず、シンプルさを重視しています。`1980年1月1日から2026年12月31日まで`の期間について、内閣府が公開している情報と比較し、正確な祝日判定ができることを確認しました。
2026年以降も自動でテストが行われるようになっており、問題があれば私宛に通知が送られ、問題が修正されるようになっています。

日本の祝日は、年によって異なるルールに基づいています。たとえば、春分の日は春分の日の定義に従って計算されますし、祝日法に基づいて固定された日付の祝日もあります。このライブラリでは、これらの異なるルールを考慮し、正確な祝日判定を行います。また、日本の営業日を判定するロジックもあり、祝日だけでなく、通常の日次の処理にも応用することができます。

Pythonライブラリ「`flaretool`」の日本の祝日を判定するためのクラス「`JapaneseHolidays`」を使うと、簡単に特定の日付が祝日かどうかを判定したり、特定の期間内の祝日や営業日を取得することができます。この記事では、`JapaneseHolidays`の使い方とインストール方法を詳しく解説します。

https://flarebrow.github.io/flaretool/flaretool.holiday.html#module-flaretool.holiday.JapaneseHolidays

flaretoolをインストールするためには、以下のコマンドを使用します。

```bash
pip install flaretool
```

インストールが完了したら、次の手順でライブラリを使い始めましょう。
以下のコードでは、`flaretool.holiday`モジュールから`JapaneseHolidays`クラスをインポートしています。（オンライン版は`JapaneseHolidaysOnline`）

```python
# オフライン版
from flaretool.holiday import JapaneseHolidays
# オンライン版
from flaretool.holiday import JapaneseHolidaysOnline
import datetime
```

次に、`JapaneseHolidays`クラスのインスタンスを作成します。

```python
# オフライン版
holidays = JapaneseHolidays()
# オンライン版を使う場合はこちら
# holidays = JapaneseHolidaysOnline()
```

# 使用例

## 特定の日付が祝日かどうかを判定する方法

```python
date = datetime.date(2023, 1, 1)
is_holiday = holidays.get_holiday_name(date)
print(is_holiday)  # "元日" が出力される
```

上記の例では、`2023年1月1日`が祝日であることを判定し、結果として「元日」が出力されます。

```python
date = "2023/01/01"
is_holiday = holidays.get_holiday_name(date)
print(is_holiday)  # "元日" が出力される
```
上記のように文字列の日時からでも祝日の判定ができます。

```python
date = datetime.date(2023, 2, 1)
is_holiday = holidays.get_holiday_name(date)
print(is_holiday)  # None が出力される
```

祝日ではない場合はNoneが出力されます。

## 特定の期間内の祝日一覧を取得する方法

```python
start_date = datetime.date(2023, 1, 1)
end_date = datetime.date(2023, 12, 31)
holiday_list = holidays.get_holidays_in_range(start_date, end_date)
for holiday in holiday_list:
    print(holiday)
```

上記の例では、`2023年1月1日`から`2023年12月31日`までの期間に存在する祝日の一覧を取得し、出力します。

```python
holiday_list = holidays.get_holidays("2023")
for holiday in holiday_list:
    print(holiday)
```

上記の例では、`2023年`の祝日の一覧を取得し、出力します。

```python
holiday_list = holidays.get_holidays("202305")
for holiday in holiday_list:
    print(holiday)
```
上記の例では、`2023年5月`の祝日の一覧を取得し、出力します。


## 独自の休日を定義する方法

```python
rest_date = datetime.date(2023, 6, 1)
holidays.set_additional_holiday("独自の休日", rest_date)

is_holiday = holidays.get_holiday_name(rest_date)
print(is_holiday)  # "独自の休日" が出力される
```

上記のように独自の休日を定義して処理することもできます。
例では、「2023年6月1日」を「独自の休日」という名前で定義しています。

## 特定の営業日を取得する方法

```python
# 7月を指定
date = datetime.date(2023, 7, 1)

# 第1営業日を取得
business_day = holidays.get_first_business_day(date)
print(business_day)  # "2023-07-03" が出力される

# 第4営業日を取得
business_day = holidays.get_first_business_day(date, 4)
print(business_day)  # "2023-07-06" が出力される

## 最終営業日を取得
business_day = holidays.get_last_business_day(date)
print(business_day)  # "2023-07-31" が出力される
```

上記のように特定の月の営業日を取得することができます。

## 特定期間内の営業日のリストを取得する方法

```python
start_date = datetime.date(2023, 1, 1)
end_date = datetime.date(2023, 12, 31)
business_days = holidays.get_business_date_range(start_date, end_date)
for business_day in business_days:
    print(business_day)
```

上記の例では、`2023年1月1日`から`2023年12月31日`までの期間の営業日のリストを取得し、出力します。

flaretool.holidayライブラリはシンプルなインターフェースを備えており、使いやすく信頼性も高いです。このライブラリを活用して、日本の祝日に関する処理をスムーズに行いましょう。素早く正確な祝日判定ができるflaretool.holidayを使って、日本の祝日を思いっきり楽しみましょう！

# サンプルコード

```python
# オフライン版
from flaretool.holiday import JapaneseHolidays
# オンライン版
from flaretool.holiday import JapaneseHolidaysOnline
import datetime

# JapaneseHolidaysクラスのインスタンスを作成
holidays = JapaneseHolidays()
# オンライン版を使う場合はこちら
# holidays = JapaneseHolidaysOnline()

# 特定の日付が祝日かどうかを判定(date型)
date = datetime.date(2023, 1, 1)
is_holiday = holidays.get_holiday_name(date)
print(is_holiday)  # "元日" が出力される

# 特定の日付が祝日かどうかを判定(str型)
date = "2023/1/1"
is_holiday = holidays.get_holiday_name(date)
print(is_holiday)  # "元日" が出力される

# 特定の日付が祝日かどうかを判定(祝日ではない場合)
date = "2023/1/3"
is_holiday = holidays.get_holiday_name(date)
print(is_holiday)  # None が出力される

# 特定の期間内の祝日一覧を取得
start_date = datetime.date(2023, 1, 1)
end_date = datetime.date(2023, 12, 31)
holiday_list = holidays.get_holidays_in_range(start_date, end_date)
for holiday in holiday_list:
    print(holiday)
# 出力例:
# (datetime.date(2023, 1, 1), "元日")
# (datetime.date(2023, 1, 2), "元日（振替休日）")
# (datetime.date(2023, 1, 9), "成人の日")
# (datetime.date(2023, 2, 11), "建国記念の日")
# ...

# 2023年の祝日を取得
holiday_list = holidays.get_holidays("2023")
for holiday in holiday_list:
    print(holiday)
# 出力例:
# (datetime.date(2023, 1, 1), "元日")
# (datetime.date(2023, 1, 2), "元日（振替休日）")
# (datetime.date(2023, 1, 9), "成人の日")
# (datetime.date(2023, 2, 11), "建国記念の日")
# ...

# 2023年5月の祝日を取得
holiday_list = holidays.get_holidays("202305")
for holiday in holiday_list:
    print(holiday)
# 出力例:
# (datetime.date(2023, 5, 3), '憲法記念日')
# (datetime.date(2023, 5, 4), 'みどりの日')
# (datetime.date(2023, 5, 5), 'こどもの日')

# 営業日を取得(7月)
date = datetime.date(2023, 7, 1)

## 第1営業日を取得
business_day = holidays.get_first_business_day(date)
print(business_day)  # "2023-07-03" が出力される

## 第4営業日を取得
business_day = holidays.get_first_business_day(date, 4)
print(business_day)  # "2023-07-06" が出力される

## 最終営業日を取得
business_day = holidays.get_last_business_day(date)
print(business_day)  # "2023-07-31" が出力される

# 特定期間内の営業日のリストを取得
business_days = holidays.get_business_date_range(start_date, end_date)
for business_day in business_days:
    print(business_day)
# 出力例:
# 2023-01-03
# 2023-01-04
# 2023-01-05
# ...
```

<hr>

この記事では以下のライブラリの一部の機能を紹介しました。他にも便利な機能を公開しているので、ぜひご確認ください！

https://qiita.com/flarebrow/items/76cf9993a60c0e98de57