表題の通りです。ベストマッチな記事が見当たらなかったので。
実行環境はPython3系になります。
必要なモジュールのインポート
インストールされていない場合はpip install
する必要があります。
import calendar, jpholiday
祝日を取得する
GitHub - Lalcs/jpholiday: 日本の祝日を取得するライブラリ
jpholiday.month_holidays
を使います。2021年5月の祝日を取得する場合は以下のようになります。
holidays = list(map(lambda d: d[0], jpholiday.month_holidays(2021, 5)))
print(holidays)
# [datetime.date(2021, 5, 3), datetime.date(2021, 5, 4), datetime.date(2021, 5, 5)]
土日を取得する
calendar.Calendar
のクラスメソッドitermonthdates
を利用します。
calendar --- 一般的なカレンダーに関する関数群 — Python 3.9.2 ドキュメント
year 年 month (1--12) 月に対するイテレータを返します。 このイテレータはその月の全ての日、およびその月が始まる前の日とその月が終わった後の日のうち、週の欠けを埋めるために必要な日を (datetime.date オブジェクトとして) 返します。
若干仕様がわかりにくいかと思うので補足すると、「週の欠けを埋めるために必要な日」というのは、「月曜日で始まり日曜日で終わるリストを返すために必要な前後の月の日」という意味です。
例えば2021年5月は土曜日に始まって月曜日に終わるので、月曜日で始まり日曜日で終わるリストにするため、4/26(月)~4/30(金)、6/1(火)~6/6(土)も含めるということです。
itermonthdays
という似たようなメソッドもありますが、こちらはdatetime.date
オブジェクトではなくint
やタプルで返ってきます。用途に応じて使い分けると良いと思います。
2021年5月の土日を取得する場合は以下のようになります。
c = calendar.Calendar()
donichi = list(filter(lambda d: d.month == 5 and d.weekday() in [5,6], c.itermonthdates(2021,5)))
print(donichi)
# [datetime.date(2021, 5, 1), datetime.date(2021, 5, 2), datetime.date(2021, 5, 8), datetime.date(2021, 5, 9), datetime.date(2021, 5, 15), datetime.date(2021, 5, 16), datetime.date(2021, 5, 22), datetime.date(2021, 5, 23), datetime.date(2021, 5, 29), datetime.date(2021, 5, 30)]
マージして昇順にソートする
上で取得した2つのリストを重複の内容に結合して昇順にソートします。
重複を除外するためにset
に変換した後、ソートするためにリストに戻します。特に理由がなければ最初からset
にしておいた方がスマートかも。
dns = sorted(list(set(holidays + donichi)), key=lambda d: d.day)
print(dns)
# [datetime.date(2021, 5, 1), datetime.date(2021, 5, 2), datetime.date(2021, 5, 3), datetime.date(2021, 5, 4), datetime.date(2021, 5, 5), datetime.date(2021, 5, 8), datetime.date(2021, 5, 9), datetime.date(2021, 5, 15), datetime.date(2021, 5, 16), datetime.date(2021, 5, 22), datetime.date(2021, 5, 23), datetime.date(2021, 5, 29), datetime.date(2021, 5, 30)]
上の3つを関数にまとめたら以下のようになります。dns
はDo Nichi Shukujitsu
の略です。
祝日・土日をset
で取得するように変えました。
def get_dns_dates(y, m):
"""
y年m月の土日祝日のリストを返却する
"""
# 祝日を取得
holidays = set(map(lambda d: d[0], jpholiday.month_holidays(y, m)))
# 土日を取得
c = calendar.Calendar()
donichi = set(filter(lambda d: d.month == m and d.weekday() in [5,6], c.itermonthdates(y,m)))
# マージして昇順にソート
dns = sorted(list(holidays + donichi), key=lambda d: d.day)
return dns
参考にした記事
datetimeとjpholidayを組み合わせて、平日か土日祝日かを判定するスクリプト - Qiita
Pythonで第何何曜日(第2月曜日など)の日付を取得 | note.nkmk.me