📝

Pythonで祝日を調べる方法

2023/03/21に公開

jpholidayライブラリを使い祝日を調べる

  • jpholidayでできること
    • 指定日の祝日名を取得
    • 指定日が祝日か判定
    • 指定月と年の祝日を取得
    • 指定範囲の祝日を取得
    • 独自の休日を追加、削除

使い方

datetimeライブラリを使うのでインポートを忘れずに

pip install jpholiday

指定日の祝日名を取得

  • is_holiday_nameメソッドを使います
  • datetime.datetimeを引数にしても同じようにできます
import jpholiday
import datetime

print(jpholiday.is_holiday_name(datetime.date(2023, 3, 22)))
# 春分の日
print(jpholiday.is_holiday_name(datetime.date(2023, 3, 22)))
# None

指定日が祝日か判定

  • is_holidayメソッドを使います
  • 祝日がある時True、ない時Falseを返します
  • datetime.datetimeを引数にしても同じようにできます
import jpholiday
import datetime

print(jpholiday.is_holiday(datetime.date(2023, 3, 21)))
# True
print(jpholiday.is_holiday(datetime.date(2023, 3, 22)))
# False

指定月と年の祝日を取得

指定の月の祝日を取得

  • month_holidaysメソッドを使います
import jpholiday
import datetime

print(jpholiday.month_holidays(2023, 3))
# [(datetime.date(2023, 3, 21), '春分の日')]

指定の年の祝日を取得

  • year_holidaysメソッドを使います
import jpholiday
import datetime

print(jpholiday.year_holidays(2023))
# [(datetime.date(2023, 1, 1), '元日'), (datetime.date(2023, 1, 2), '元日 振替休日'), (datetime.date(2023, 1, 9), '成人の日'), (datetime.date(2023, 2, 11), '建国記念の日'), (datetime.date(2023, 2, 23), '天皇誕生日'), (datetime.date(2023, 3, 21), '春分の日'), (datetime.date(2023, 4, 29), '昭和の日'), (datetime.date(2023, 5, 3), '憲法記念日'), (datetime.date(2023, 5, 4), 'みどりの日'), (datetime.date(2023, 5, 5), 'こどもの日'), (datetime.date(2023, 7, 17), '海の日'), (datetime.date(2023, 8, 11), '山の日'), (datetime.date(2023, 9, 18), '敬老の日'), (datetime.date(2023, 9, 23), '秋分の日'), (datetime.date(2023, 10, 9), 'スポーツの日'), (datetime.date(2023, 11, 3), '文化の日'), (datetime.date(2023, 11, 23), '勤労感謝の日')]

指定範囲の祝日を取得

  • betweenメソッドを使います
  • datetime.datetimeを引数にしても同じようにできます
import jpholiday
import datetime

print(jpholiday.between(datetime.date(2023, 3, 21), datetime.date(2023, 7, 31)))
# [(datetime.date(2023, 3, 21), '春分の日'), (datetime.date(2023, 4, 29), '昭和の日'), (datetime.date(2023, 5, 3), '憲法記念日'), (datetime.date(2023, 5, 4), 'みどりの日'), (datetime.date(2023, 5, 5), 'こどもの日'), (datetime.date(2023, 7, 17), '海の日')]

独自の休日を追加、削除

jpholiday.OriginalHolidayを新しいクラスに継承し用意されている_is_holiday_is_holiday_nameを使います

休日追加

import jpholiday
import datetime

class MyHoliday(jpholiday.OriginalHoliday):
    def _is_holiday(self, date):
        if date == datetime.date(2023, 3, 22):
            return True
        return False

    def _is_holiday_name(self, date):
        return '休み'
    
print(jpholiday.is_holiday_name(datetime.date(2023, 3, 22)))
# 休み

print(jpholiday.is_holiday(datetime.date(2023, 3, 22)))
# True

休日削除

import jpholiday
import datetime

jpholiday.OriginalHoliday.unregister(MyHoliday)

応用

祝日、休日に色付きでターミナルに一覧で表示方法

coloramaを使い文字に色をつけます

pip install colorama
import jpholiday
import datetime
from colorama import Fore, init
init()

# 現在の年の取得
now_year = datetime.datetime.now().year
date = datetime.datetime(now_year, 1, 1, 0, 0)

WEEKDAY = ('月','火','水','木','金','土','日')

for i in range(365):

    date_str = date.strftime(r"%Y-%m-%d")
    holiday = jpholiday.is_holiday_name(date)

    # 曜日の取得
    week = WEEKDAY[date.weekday()]

    # 文字に色をつける
    if week == WEEKDAY[-1]:
        week = Fore.RED + week
    elif week == WEEKDAY[-2]:
        week = Fore.BLUE + week
    
    # 祝日なのか(jpholiday.is_holidayでも可)
    if holiday is None:
        print(f'{Fore.RESET + date_str} {week}曜日 ')
    else:
        print(f'{Fore.RESET + date_str} {Fore.RED + week}曜日 {holiday}')
    date += datetime.timedelta(days=1)
else:
    print(Fore.RESET) # 色のリセット

今日が祝日かどうか

import jpholiday
import datetime

date_now = datetime.datetime.now().date()

holiday = jpholiday.is_holiday(date_now)

if holiday:
    holiday_name = jpholiday.is_holiday_name(date_now)
    print(f"今日は{holiday_name}です。")
else:
    print(f"今日は祝日ではありません。")

独自の休日を複数追加方法

休日追加の応用

import jpholiday
import datetime

class MyHoliday(jpholiday.OriginalHoliday):
    
    df = {
        '2023-03-22' : '休み1',
        '2023-03-23' : '休み2',
    }
    
    def _is_holiday(self, date):
        if date in [datetime.datetime.strptime(holiday, "%Y-%m-%d").date() for holiday in self.df.keys()]:
            return True
        else:
            return False

    def _is_holiday_name(self, date):
        if date.strftime('%Y-%m-%d') in self.df.keys():
            return self.df[date.strftime('%Y-%m-%d')]
        else:
            return None

print(jpholiday.is_holiday(datetime.date(2023, 3, 22)))
# True
print(jpholiday.is_holiday_name(datetime.date(2023, 3, 22)))
# 休み1
print(jpholiday.is_holiday_name(datetime.date(2023, 3, 23)))
# 休み2

ライブラリ

https://github.com/Lalcs/jpholiday

https://pypi.org/project/colorama/

Discussion