2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonで月毎の土日祝日のリストを取得する

Posted at

表題の通りです。ベストマッチな記事が見当たらなかったので。
実行環境は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つを関数にまとめたら以下のようになります。dnsDo 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

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?