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

国民の祝日について - 内閣府
内閣府 国民の祝日について。国民の祝日に関...
CSVファイルの内容
CSVの内容を見てみます。
1 2 3 4 |
国民の祝日・休日月日,国民の祝日・休日名称 2017-01-01,元日 2017-01-02,休日 ... |
CSVに記載されている祝日は平成29年(2017年)から平成31年(2019年)までの祝日です。
1行目はヘッダーです
2行目から祝日のデータが入っています。
祝日の日付と祝日名がカンマで区切られています。
休日・祝日判定のコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
import csv from datetime import datetime class JapanHoliday: """ 内閣府が公表している「平成29年(2017年)から平成31年(2019年)国民の祝日等 (いわゆる振替休日等を含む)」のCSVを使用して 入力された日付('2017-01-01' %Y-%m-%d形式)が土、日、休日か判定するクラス """ def __init__(self, path='syukujitsu_kyujitsu.csv', encoding='cp932'): self._holidays = self._read_holiday(path, encoding) def _read_holiday(self, path, encoding): """ CSVファイルを読み込み、self.holidaysに以下の形式のdictをListに格納する {'2017-01-09': {'day': '2017-01-09', 'name': '成人の日'}} CSVファイルがないとIOErrorが発生する :param path: 祝日と祝日名が記入されたCSVファイル。ヘッダーが必要 :param encoding: CSVファイルのエンコーディング :return: [{'2017-01-09': {'day': '2017-01-09', 'name': '成人の日'}...}] """ holidays = {} with open(path, encoding=encoding, newline='') as f: reader = csv.reader(f) next(reader) # CSVのヘッダーを飛ばす for row in reader: day, name = row[0], row[1] holidays[day] = {'day': day, 'name': name} return holidays def is_holiday(self, day_str): """ 土、日、祝日か判定する :param day_str: '2018-03-01'の%Y-%m-%dのstrを受け取る。 形式が違うとValueErrorが発生 :return: 土、日、祝日ならTrue, 平日ならFalse """ try: day = datetime.strptime(day_str, '%Y-%m-%d') if day.weekday() >= 5: return True except ValueError: print('日付は2018-03-01 %Y-%m-%dの形式で入力してください') raise ValueError if day_str in self._holidays: return True return False def get_holiday_dict(self): """ 祝日を一覧化したdictを返す {'2017-01-09': {'day': '2017-01-09', 'name': '成人の日'}, '2017-02-11': {'day': '2017-02-11', 'name': '建国記念の日'},...} """ return self._holidays |
使用方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
from japan_holiday import JapanHoliday holiday = JapanHoliday() print(holiday.is_holiday('2018-01-04')) # 平日木曜日なのでFalse print(holiday.is_holiday('2018-01-06')) # 土曜日なのでTrue print(holiday.is_holiday('2018-01-07')) # 日曜日なのでTrue print(holiday.is_holiday('2018-01-07')) # 祝日成人の日なのでTrue holiday_dict = holiday.get_holiday_dict() # 祝日一覧を取得 print(holiday_dict['2017-01-01']['day']) # 2017-01-01 print(holiday_dict['2017-01-01']['name']) # 元日 # デフォルトではpythonファイルと同じ場所のsyukujitsu_kyujitsu.csvを読み込みます # パスが違う場合はpathにcsvのファイルパスを入力します。 # holiday_another = JapanHoliday(path='C:\\holiday.csv') # デフォルトのエンコーディングはcp932です。 # cp932以外の文字コードを使用するときは、encodingに使用する文字コードを指定します。 # holiday_another = JapanHoliday(encoding='utf-8') # ファイルパスと文字コードの指定例 # # holiday_another = JapanHoliday('C:\\holiday.csv', 'utf-8') |
.pyファイルと一緒のパスに、内閣府のページからダウンロードした
syukujitsu_kyujitsu.csvを置きます。
デフォルトではpythonファイルと同じ場所のsyukujitsu_kyujitsu.csvを読み込みます
パスが違う場合はpathにcsvのファイルパスを入力します。
1 |
holiday_another = JapanHoliday(path='C:\\holiday.csv') |
デフォルトの文字コードはcp932です。
cp932以外の文字コードを使用するときは、文字コードを指定します。
1 |
holiday_another = JapanHoliday(encoding='utf-8') |
ファイルパスと文字コードの指定例です。
1 |
holiday_another = JapanHoliday('C:\\holiday.csv', 'utf-8') |
is_holidayで休日または祝日の判定を行います。
休日・祝日であればTrue、平日であればFalseを返します。
引数は文字列で’2018-01-01’の形式で入力してください。
形式が違うとValueErrorになります。
1 2 3 4 |
print(holiday.is_holiday('2018-01-04')) # 平日木曜日なのでFalse print(holiday.is_holiday('2018-01-06')) # 土曜日なのでTrue print(holiday.is_holiday('2018-01-07')) # 日曜日なのでTrue print(holiday.is_holiday('2018-01-07')) # 祝日成人の日なのでTrue |
get_holiday_dictで祝日の一覧のdictonaryを取得します。
1 2 3 |
holiday_dict = holiday.get_holiday_dict() # 祝日一覧を取得 print(holiday_dict['2017-01-01']['day']) # 2017-01-01 print(holiday_dict['2017-01-01']['name']) # 元日 |
GitHubのリンク
GitHubのリンクです。
GitHub - kazusapg/JapanHoliday: 内閣府が公表している祝日のCSVを使用して、入力された日付が休日または祝日か判定します
内閣府が公表している祝日のCSVを使用して、入力された日付が休日または祝日か判定します. Contribute to kazusapg/JapanHoliday development by creating an account on GitHub.
コメント