PythonでMarkwhen用祝日リストを自動生成してみた

Markwhenはマークダウン形式で手軽にタイムラインやカレンダーを作成できる便利なツールです。

私も業務でのスケジュール管理に使用していますが、日本の祝日も表示できればより良いな〜と考えていました。
そこで今回はPythonを使って、Markwhen形式の祝日リストを自動生成して、スケジュールに組み込む方法を紹介します。

PythonでMarkwhen形式の祝日リストを自動生成する

こちらが今回作成したPythonコードです。

import csv
import datetime as dt
import requests

CSV_URL = "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"

def fetch_holidays(url: str) -> list[tuple[str, str]]:
    """内閣府のサイトから祝日データを取得する"""
    resp = requests.get(url, timeout=30)
    resp.raise_for_status()
    # 内閣府csvデータはShift‑JISエンコードされている
    csv_content = resp.content.decode("shift_jis").splitlines()
    reader = csv.reader(csv_content)
    holidays_list = [(d, n) for d, n in reader 
            if d and d[0].isdigit()]
    return holidays_list

def to_markwhen(holidays: list[tuple[str, str]], y_from: int, y_to: int) -> str:
    """祝日リストをmarkwhen形式の文字列に変換する"""
    header = f"title: Japanese Holidays {y_from}-{y_to}\n\n"
    start_section = "section holidays #holidays\n"
    end_section = "end section\n"
    body = [
       f"{dt.datetime.strptime(date_str, '%Y/%m/%d').strftime('%Y-%m-%d')}: {name}"
       for date_str, name in holidays
        if y_from <= int(date_str[:4]) <= y_to
    ]
    return header + start_section + "\n".join(body) + "\n" + end_section

def main() -> None:
    #実行時点での年+1年分の祝日データを取得する
    year_from = dt.date.today().year
    year_to = year_from + 1
    holidays = fetch_holidays(CSV_URL)
    mw_text = to_markwhen(holidays, year_from, year_to)
    
    filepath = f"holidays_{year_from}-{year_to}.mw"
    with open(filepath, mode = 'w') as f:
        f.write(mw_text)


if __name__ == "__main__":
    main()

コードの流れは以下の通りです。

  1. 内閣府のサイトから日本の祝日データを取得する。(次の年の祝日まで掲載されています)
    https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv
  2. 実行時点での年〜+1年分の祝日データをlist型(holidays_list)に格納
  3. 祝日リストをMarkwhen形式(「YYYY-MM-DD: 祝日名」)に変換
  4. .mwファイルとして保存

これを実行すると、holidays_YYYY-YYYY.mw(例: holidays_2025-2026.mw)という名前のファイルが作成されます。
内容は以下のようなMarkwhen形式の祝日リストです。

title: Japanese Holidays 2025-2026

section holidays #holidays
2025-01-01: 元日
2025-01-13: 成人の日
2025-02-11: 建国記念の日
2025-02-23: 天皇誕生日
2025-02-24: 休日
2025-03-20: 春分の日
2025-04-29: 昭和の日
2025-05-03: 憲法記念日
2025-05-04: みどりの日
2025-05-05: こどもの日
2025-05-06: 休日
2025-07-21: 海の日
2025-08-11: 山の日
2025-09-15: 敬老の日
2025-09-23: 秋分の日
2025-10-13: スポーツの日
2025-11-03: 文化の日
2025-11-23: 勤労感謝の日
2025-11-24: 休日
2026-01-01: 元日
2026-01-12: 成人の日
2026-02-11: 建国記念の日
2026-02-23: 天皇誕生日
2026-03-20: 春分の日
2026-04-29: 昭和の日
2026-05-03: 憲法記念日
2026-05-04: みどりの日
2026-05-05: こどもの日
2026-05-06: 休日
2026-07-20: 海の日
2026-08-11: 山の日
2026-09-21: 敬老の日
2026-09-22: 休日
2026-09-23: 秋分の日
2026-10-12: スポーツの日
2026-11-03: 文化の日
2026-11-23: 勤労感謝の日
end section

タイムライン表示はこんな感じです。

祝日リストを既存のスケジュールファイルに組み込む

古典的ですが、holidays_YYYY-YYYY.mwの中身をコピーして、既存のスケジュールファイルに貼り付けます。

Markwhenには他のMarkwhenファイルのimport機能がありますが、ローカルファイルのインポートは不可のようです。markwhen.com上の共有ファイルもしくは、外部公開されているURLからでないと取り込めないようなので、今回は断念しました。

そのままだと見づらいので、エディタ、タイムラインともに祝日セクションを折りたたんでいます。
タイムライン上の”holidays” セクションを見ればどこに祝日があるか分かるので、結構見やすいのではないでしょうか。

カレンダー表示でも祝日がしっかりと表示されています。

まとめ

このPythonスクリプトを使えば、手軽に日本の祝日情報をmarkwhenカレンダーに統合できます。

改善点があるとすれば、可能ならimport機能を使ってみたいですね。
例えば、Markwhenにサインインして祝日ファイルを共有ファイルとして保存するか、もしくはGithub上に公開すれば、いけそうな気がします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする