【曜日取得 実装例】演習で身に付けるpythonプログラミング【vol. 4】

【再掲】リクエスト:祝日に対応する曜日の取得

日本の祝日一覧が記載されている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)

今回のポイント

余談

リクエストを考えていたときは、曜日を取得するアルゴリズムの実装が大変かと思ってましたが、便利な公式のおかげですんなりできました。先人に感謝です。

コメント

タイトルとURLをコピーしました