[Python] 363 カレンダーicsファイルをjsonファイルに変換

[Mac M2 Pro 12CPU, Ventura 13.6, Python 3.10.4]

Googleカレンダーから入手したicsファイルの内容をgpt-4oに見せて、jsonファイルの作成スクリプトを考えさせました。

これまではGitHubなどから使えそうなコードを引っ張ってきたりしていましたが、AIに作らせる方が手っ取り早いです。

今回の場合はicsファイルに記念日が混在していたので、結局自分で手を入れて仕上げることになりました。

import json
from icalendar import Calendar
from datetime import datetime

# アメリカの祝日リスト
us_holidays = {
    "New Year's Day",
    "Martin Luther King Jr. Day",
    "Presidents' Day",
    "Memorial Day",
    "Juneteenth",
    "Independence Day",
    "Labor Day",
    "Columbus Day",
    "Veterans Day",
    "Thanksgiving Day",
    "Christmas Day"
}

def parse_ics(file_path):
    with open(file_path, 'r') as f:
        ics_content = f.read()

    calendar = Calendar.from_ical(ics_content)
    holidays = {}

    for component in calendar.walk():
        if component.name == "VEVENT":
            summary = str(component.get('summary'))
            dtstart = component.get('dtstart').dt
            if isinstance(dtstart, datetime):
                dtstart = dtstart.date()
            dtstart_str = dtstart.strftime('%Y-%m-%d')
            
             # アメリカの祝日リストに含まれているか確認
            if any(holiday in summary for holiday in us_holidays):
                holidays[dtstart_str] = summary

    return holidays

def save_to_json(data, output_file):
    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)

if __name__ == "__main__":
    ics_file_path = 'america.ics'  # ICSファイルのパスを指定
    output_json_file = 'holidayUS.json'  # 出力するJSONファイルの名前

    holidays = parse_ics(ics_file_path)
    
    # 日付の昇順で並べ替え
    sorted_holidays = dict(sorted(holidays.items()))

    save_to_json(sorted_holidays, output_json_file)
    print(f"祝日情報が {output_json_file} に保存されました。")
{
    "2019-01-01": "New Year's Day",
    "2019-01-21": "Martin Luther King Jr. Day",
    "2019-02-18": "Presidents' Day",
    "2019-05-27": "Memorial Day",
    "2019-06-19": "Juneteenth",
    "2019-07-04": "Independence Day",
    "2019-09-02": "Labor Day",
    "2019-11-11": "Veterans Day",
    "2019-11-28": "Thanksgiving Day",
    "2019-12-25": "Christmas Day",
<以下略>