【Python】休日または祝日を判定する

概要

Pythonで休日(土、日)と祝日を判定するプログラムを作成しました。

祝日の判定には内閣府で公表している「平成29年(2017年)から平成31年(2019年)国民の祝日等
(いわゆる振替休日等を含む)(csv形式:2KB)」のCSVファイルを使用します。

http://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html#syukujitu

CSVファイルの内容

CSVの内容を見てみます。

1国民の祝日・休日月日,国民の祝日・休日名称
22017-01-01,元日
32017-01-02,休日
4...

CSVに記載されている祝日は平成29年(2017年)から平成31年(2019年)までの祝日です。

1行目はヘッダーです。 2行目から祝日のデータが入っています。

祝日の日付と祝日名がカンマで区切られています。

休日・祝日判定のコード

 1import csv
 2from datetime import datetime
 3
 4
 5class JapanHoliday:
 6    """
 7    内閣府が公表している「平成29年(2017年)から平成31年(2019年)国民の祝日等
 8    (いわゆる振替休日等を含む)」のCSVを使用して
 9    入力された日付('2017-01-01' %Y-%m-%d形式)が土、日、休日か判定するクラス
10    """
11
12    def __init__(self, path='syukujitsu_kyujitsu.csv', encoding='cp932'):
13        self._holidays = self._read_holiday(path, encoding)
14
15    def _read_holiday(self, path, encoding):
16        """
17        CSVファイルを読み込み、self.holidaysに以下の形式のdictをListに格納する
18        {'2017-01-09': {'day': '2017-01-09', 'name': '成人の日'}}
19        CSVファイルがないとIOErrorが発生する
20
21        :param path: 祝日と祝日名が記入されたCSVファイル。ヘッダーが必要
22        :param encoding: CSVファイルのエンコーディング
23        :return: [{'2017-01-09': {'day': '2017-01-09', 'name': '成人の日'}...}]
24        """
25        holidays = {}
26        with open(path, encoding=encoding, newline='') as f:
27            reader = csv.reader(f)
28            next(reader)  # CSVのヘッダーを飛ばす
29            for row in reader:
30                day, name = row[0], row[1]
31                holidays[day] = {'day': day, 'name': name}
32        return holidays
33
34    def is_holiday(self, day_str):
35        """
36        土、日、祝日か判定する
37        :param day_str: '2018-03-01'の%Y-%m-%dのstrを受け取る。
38                        形式が違うとValueErrorが発生
39        :return: 土、日、祝日ならTrue, 平日ならFalse
40        """
41        try:
42            day = datetime.strptime(day_str, '%Y-%m-%d')
43            if day.weekday() >= 5:
44                return True
45        except ValueError:
46            print('日付は2018-03-01 %Y-%m-%dの形式で入力してください')
47            raise ValueError
48        if day_str in self._holidays:
49            return True
50        return False
51
52    def get_holiday_dict(self):
53        """
54        祝日を一覧化したdictを返す
55        {'2017-01-09': {'day': '2017-01-09', 'name': '成人の日'},
56         '2017-02-11': {'day': '2017-02-11', 'name': '建国記念の日'},...}
57        """
58        return self._holidays

使用方法

 1from japan_holiday import JapanHoliday
 2
 3holiday = JapanHoliday()
 4
 5print(holiday.is_holiday('2018-01-04'))  # 平日木曜日なのでFalse
 6print(holiday.is_holiday('2018-01-06'))  # 土曜日なのでTrue
 7print(holiday.is_holiday('2018-01-07'))  # 日曜日なのでTrue
 8print(holiday.is_holiday('2018-01-07'))  # 祝日成人の日なのでTrue
 9
10holiday_dict = holiday.get_holiday_dict()  # 祝日一覧を取得
11print(holiday_dict['2017-01-01']['day'])  # 2017-01-01
12print(holiday_dict['2017-01-01']['name'])  # 元日
13
14# デフォルトではpythonファイルと同じ場所のsyukujitsu_kyujitsu.csvを読み込みます
15# パスが違う場合はpathにcsvのファイルパスを入力します。
16# holiday_another = JapanHoliday(path='C:\\holiday.csv')
17
18# デフォルトのエンコーディングはcp932です。
19# cp932以外の文字コードを使用するときは、encodingに使用する文字コードを指定します。
20# holiday_another = JapanHoliday(encoding='utf-8')
21
22# ファイルパスと文字コードの指定例
23# # holiday_another = JapanHoliday('C:\\holiday.csv', 'utf-8')

.pyファイルと一緒のパスに、内閣府のページからダウンロードしたsyukujitsu_kyujitsu.csvを置きます。

デフォルトではpythonファイルと同じ場所のsyukujitsu_kyujitsu.csvを読み込みます。
パスが違う場合はpathにcsvのファイルパスを入力します。

1holiday_another = JapanHoliday(path='C:\\holiday.csv')

デフォルトの文字コードはcp932です。
cp932以外の文字コードを使用するときは、文字コードを指定します。

1holiday_another = JapanHoliday(encoding='utf-8')

ファイルパスと文字コードの指定例です。

1holiday_another = JapanHoliday('C:\\holiday.csv', 'utf-8')

is_holidayで休日または祝日の判定を行います。
休日・祝日であればTrue、平日であればFalseを返します。

引数は文字列で’2018-01-01’の形式で入力してください。 形式が違うとValueErrorになります。

1print(holiday.is_holiday('2018-01-04'))  # 平日木曜日なのでFalse
2print(holiday.is_holiday('2018-01-06'))  # 土曜日なのでTrue
3print(holiday.is_holiday('2018-01-07'))  # 日曜日なのでTrue
4print(holiday.is_holiday('2018-01-07'))  # 祝日成人の日なのでTrue</pre>

get_holiday_dictで祝日の一覧のdictonaryを取得します。

1holiday_dict = holiday.get_holiday_dict()  # 祝日一覧を取得
2print(holiday_dict['2017-01-01']['day'])  # 2017-01-01
3print(holiday_dict['2017-01-01']['name'])  # 元日</pre>

GitHubのリンク

GitHubのリンクです。

https://github.com/kazusapg/JapanHoliday

関連ページ