【再掲】リクエスト:祝日に対応する曜日の取得
日本の祝日一覧が記載されているCSVファイルに対して、曜日の情報を追加した新しいCSVファイルを作成するプログラムを作成してください。
- 祝日一覧が記載されているCSVファイルの取得場所
- 内閣府「国民の祝日」について
実装例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | # 曜日取得実装例 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リンク)を用いると直接求められます。
余談
リクエストを考えていたときは、曜日を取得するアルゴリズムの実装が大変かと思ってましたが、便利な公式のおかげですんなりできました。先人に感謝です。
コメント