【再掲】リクエスト:祝日に対応する曜日の取得
日本の祝日一覧が記載されているCSVファイルに対して、曜日の情報を追加した新しいCSVファイルを作成するプログラムを作成してください。
- 祝日一覧が記載されているCSVファイルの取得場所
- 内閣府「国民の祝日」について
実装例
# 曜日取得実装例
NH_DATE = "国民の祝日・休日月日"
NH_NAME = "国民の祝日・休日名称"
NH_DAY = "曜日"
import csv
from pathlib import Path
def get_day(date):
"""
日付を入力し、その日の曜日を返す
Args:
date (str): yyyy/m/d型の文字列
Return:
(str): 月〜日までの曜日
"""
days = ['月','火','水','木','金','土','日']
year, mm, dd = [int(v) for v in date.split('/')]
# ツェラーの公式: https://ja.wikipedia.org/wiki/ツェラーの公式
if mm == 1:
year -= 1
mm = 13
if mm == 2:
year -= 1
mm = 14
capital_y = year % 100
capital_c = year // 100
gamma = 5*capital_c + (capital_c//4)
h = (dd + (26*(mm+1) // 10) + capital_y + (capital_y//4) + gamma + 5) % 7
return days[h]
if __name__ == '__main__':
i_dir = Path('/Users/user_name/Documents/')# TODO CSVを保存したディレクトリを指定
i_fname = 'syukujitsu.csv'
o_fname = 'syukujitsu_day.csv'
# CSVファイルの読み込み
with open(i_dir / i_fname, encoding='s-jis') as f:
reader = csv.DictReader(f)
i_csv = [row for row in reader]
# 曜日の取得
syukujitsu_day = []
for line in i_csv:
day = get_day(line[NH_DATE])
line[NH_DAY] = day
syukujitsu_day.append(line)
# CSVファイルの書き込み
with open(i_dir / o_fname, encoding='utf-8', mode='w') as f:
writer = csv.DictWriter(f, [NH_DATE, NH_DAY, NH_NAME])
writer.writeheader()
writer.writerows(syukujitsu_day)
今回のポイント
- ファイルの文字コード:44行目
- 「国民の祝日」のCSVファイルは文字コードがShift-JISなので、open()モジュールでencodingとして's-jis'を指定します。
- Pythonの標準エンコーディングの一覧はリンクから参照できます。
- csv モジュール:45、57行目
- ヘッダーを考慮してCSVの入出力を行いたかったので、CSVモジュールのDictReader/DictWriterを使用しています。
- DictReader/DictWriterについてはこのサイトの説明が分かりやすいです。
- 日付から曜日を計算するアルゴリズム:21〜33行目
- ツェラーの公式(wikipediaリンク)を用いると直接求められます。
余談
リクエストを考えていたときは、曜日を取得するアルゴリズムの実装が大変かと思ってましたが、便利な公式のおかげですんなりできました。先人に感謝です。
コメント