メインコンテンツへスキップ
【Python】休日または祝日を判定する

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

··4 分
Programming Python
かずさプログラマー
著者
かずさプログラマー
業務の作業自動化を行っています。Go、VBA、Pythonを主に使用しています。過去にはC#、VB.Net、JavaScriptも使用していました。
目次

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

関連記事

【Python】subprocessでフォルダを開く【Windows環境】
·1 分
Programming Python
【Python】カウントダウンタイマーを作成する
··2 分
Programming Python
【Python】ファイルやフォルダを削除する
··2 分
Programming Python