【再掲】リクエスト:祝日に対応する曜日の取得
日本の祝日一覧が記載されている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リンク)を用いると直接求められます。
余談
リクエストを考えていたときは、曜日を取得するアルゴリズムの実装が大変かと思ってましたが、便利な公式のおかげですんなりできました。先人に感謝です。
コメント