祝日情報は最も信頼できるソースの内閣府から取得しようという話【Python】
国民の祝日、と聞いてポジティブな感情を抱く人が多い一方で、ネガティブな感情を抱く人も一定数存在します。祝日情報を扱うエンジニアです。
祝日情報は基本的に「どこかから取ってくる」か「自分で作る」の二択で実装するのですが、自分で作るのは面倒だし、取ってくるにしても信頼に足るソースがどこかわからない、という方は意外と多いような気がします。
今回は内閣府が提供する祝日情報から情報を取得しよう、というお話です。
国民の祝日について
内閣府では国民の祝日が定義されています。(内閣府:「国民の祝日」について)
「国民の祝日」は、国民の祝日に関する法律(昭和23年法律第178号)により、美しい風習を育てつつ、よりよき社会、より豊かな生活を築きあげるために定められた「国民こぞって祝い、感謝し、又は記念する日」です。
国民の祝日に関する法律では、年間に計16の日が「国民の祝日」とされ、それぞれの日の趣旨が定められています。また、「国民の祝日」は、休日とされています。
また、2024年11月6日時点で、来年2025年末までの祝日が掲載されています。
内閣府の祝日情報データ
内閣府からは、祝日情報がCSV形式で一般公開されています。
知る人ぞ知るデータで、もっと周知されてほしいです。
祝日情報CSV:syukujitsu.csv
なぜ"shukujitsu"ではなく"syukujitsu"なのか、個人的には若干気になるところですが、こちらを基にすればAPIっぽくプログラム上で祝日が扱えそうです。
プログラム例
Pythonでいくつかのサンプルを作ってみました。
DataFrameで取り込む
# DataFrameで2行で済ませる方法
import pandas as pd
df = pd.read_csv('https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv', encoding='shift_jis')
dfの中身はこんな感じになります。(1032 rows × 2 columns)
国民の祝日・休日月日 | 国民の祝日・休日名称 | |
---|---|---|
0 | 1955/1/1 | 元日 |
1 | 1955/1/15 | 成人の日 |
2 | 1955/3/21 | 春分の日 |
3 | 1955/4/29 | 天皇誕生日 |
4 | 1955/5/3 | 憲法記念日 |
… | … | … |
1027 | 2025/9/23 | 秋分の日 |
1028 | 2025/10/13 | スポーツの日 |
1029 | 2025/11/3 | 文化の日 |
1030 | 2025/11/23 | 勤労感謝の日 |
1031 | 2025/11/24 | 休日 |
辞書やJSONで取り込む
DataFrameは使えなくて・・・という場合もあると思いますので、代替案も用意しました。
import csv
import json
import requests
results = {}
r = requests.get('https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv')
r_content = r.content.decode('shift_jis')
reader = csv.reader(r_content.splitlines(), delimiter=',')
next(reader)
for line in reader:
if line[1] == '休日':
line[1] = '振替休日'
results[line[0]] = line[1]
j = json.dumps(results, ensure_ascii=False)
省略していますが、以下のような結果が得られます。
{'1955/1/1': '元日', '1955/1/15': '成人の日', '1955/3/21': '春分の日', '1955/4/29': '天皇誕生日', '1955/5/3': '憲法記念日', '1955/5/5': 'こどもの日', ... , '2025/9/23': '秋分の日', '2025/10/13': 'スポーツの日', '2025/11/3': '文化の日', '2025/11/23': '勤労感謝の日', '2025/11/24': '振替休日'}
地味に「休日」を「振替休日」に変更しています。
「休日」のままが良い場合は、for句を除いてください。
まとめ
以上、内閣府の祝日情報取得についてでした。
更新データは異なるURLで提供されていたりするみたいなので(やめてほしい・・・)、毎年そのあたりは確認した方が良いと思われます。
ディスカッション
コメント一覧
まだ、コメントがありません