【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のリンクです。