Pythonで休日(土、日)と祝日を判定するプログラムを作成しました。
祝日の判定には祝日は内閣府から提供されているcsvファイルを使用します。
国民の祝日について - 内閣府
CSVファイルの内容 #
CSVの内容を見てみます。
国民の祝日・休日月日,国民の祝日・休日名称
2017-01-01,元日
2017-01-02,休日
...
1行目はヘッダーです。
2行目から祝日のデータが入っています。
祝日の日付と祝日名がカンマで区切られています。
休日・祝日判定のコード #
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
使用方法 #
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ファイルと一緒のパスに、内閣府のページからダウンロードしたcsvを置きます。
デフォルトではpythonファイルと同じ場所のcsvを読み込みます。
パスが違う場合はpathにcsvのファイルパスを入力します。
holiday_another = JapanHoliday(path='C:\\holiday.csv')
デフォルトの文字コードはcp932です。
cp932以外の文字コードを使用するときは、文字コードを指定します。
holiday_another = JapanHoliday(encoding='utf-8')
ファイルパスと文字コードの指定例です。
holiday_another = JapanHoliday('C:\\holiday.csv', 'utf-8')
is_holiday
で休日または祝日の判定を行います。
休日・祝日であればTrue
、平日であればFalse
を返します。
引数は文字列で’2018-01-01’の形式で入力してください。 形式が違うとValueErrorになります。
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</pre>
get_holiday_dictで祝日の一覧のdictonaryを取得します。
holiday_dict = holiday.get_holiday_dict() # 祝日一覧を取得
print(holiday_dict['2017-01-01']['day']) # 2017-01-01
print(holiday_dict['2017-01-01']['name']) # 元日</pre>
GitHubのリンク #
kazusapg/JapanHoliday
内閣府が公表している祝日のCSVを使用して、入力された日付が休日または祝日か判定します
Python
0
0