本記事(記事カラム)には広告が含まれています。
人気ブログランキング

年月日を入力し、米雇用統計発表日からのオフセットを表示する|Python 練習 18-4

記事内に広告が含まれています。

tkinter で年月日を入力し、米雇用統計発表日からのオフセットを表示します。

2003年~2026年8月の期間を対象にしています。

DMM FX広告(差し込みタイプ)
広告(PR)|自分の投資スタイルを見つける。※タップで開閉
広告(PR)

DMM FXは、「最初の一歩を踏み出す場」として選ばれることがある

口座を開いてみた。取引してみた。思ったよりも難しかった。──そんな経験が、投資との距離感を知るきっかけになることもあります。


サービスを通じて、自分の投資スタイルを見つける。それは、確信ではなくても構いません。「試してみた」という実感が、次の選択の材料になることもあるからです。


DMM FXに関する詳細は、以下の広告(PR)リンクをご覧いただけます。


👇こちらは広告(PR)リンクバナーです

DMMFX

実際に書いたコード

【試してみる際のお願い】

  • プログラミングは、お使いのパソコンの環境(OSやアプリのバージョン)によって、同じコードでもエラーが出るケースがよくあります。
  • 外部での実行や利用を想定して作られていないため、万が一、動作を試されたことにより不具合等の損害が生じても、当方は一切の責任を負いかねます。
  • 自分用のメモにつき、質問やバグ修正などの個別サポートは一切行っておりません。試す場合は完全な自己責任でお願いいたします。
# 年月日を入力し、米雇用統計発表日からのオフセットを表示する
# オフセット:日数、発表日当日は0、発表日前はマイナス、発表後はプラス
import tkinter as tk
from datetime import datetime, timedelta


def show_offset():
    year = year_entry.get()
    month = month_entry.get()
    day = day_entry.get()

    # 入力が数字がどうかチェック
    if not (year.isdigit() and month.isdigit() and day.isdigit()):
        result_label.config(text="数字を入力してください")
        return

    try:
        # 入力年月日
        y0 = int(year)
        m0 = int(month)
        d0 = int(day)
        dt0 = datetime(y0, m0, d0)

        # 入力年月から前月12日を計算
        y = y0
        m = m0
        d = 12

        m -= 1
        if m < 1:
            m = 12
            y -= 1
        dt = datetime(y, m, d)  # 前月12日

    except ValueError:
        result_label.config(text="存在しない年月です")
        return

    # 12日を含む週が終わってから3回目の金曜日が翌月の何日かを計算
    weekday_sunday0 = dt.isoweekday() % 7  # 日曜日=0 に変換
    friday = d + 5 - weekday_sunday0  # 12日を含む週の金曜日
    friday_3 = datetime(y, m, friday) + timedelta(
        days=21
    )  # 12日を含む週の金曜日から3週間後

    # 例外チェック
    # 2003年以降、2026年8月までを対象としています。
    # この例外は、現在内容を確認中です。参考程度にしてください。
    # 私が全ての年月で比較した上で作成した表ではなく、
    # 正確さがどの程度なのか分かっていません。
    result = friday_3
    cancel = False

    if result == datetime(2003, 7, 4):
        result = result.replace(day=3)

    if result == datetime(2008, 7, 4):
        result = result.replace(day=3)

    if result == datetime(2013, 10, 4):
        result = result.replace(day=22)

    if result == datetime(2013, 11, 1):
        result = result.replace(day=8)

    if result == datetime(2015, 7, 3):
        result = result.replace(day=2)

    if result == datetime(2020, 7, 3):
        result = result.replace(day=2)

    if result == datetime(2025, 11, 7):
        cancel = True  # 中止

    if result == datetime(2025, 12, 5):
        result = result.replace(day=16)

    if result == datetime(2026, 1, 2):
        result = result.replace(day=10)

    if result == datetime(2026, 2, 6):
        result = result.replace(day=11)

    if result == datetime(2026, 7, 3):
        result = result.replace(day=2)

    if cancel:
        offset_label.config(text="中止")
    else:
        offset = dt0.day - result.day
        offset_label.config(text=f"{offset:+d}")
        # :+dは、正の数とゼロに"+"を付ける指定子


# --- GUI構築 ---
root = tk.Tk()
root.title("米雇用統計発表日からのオフセットを表示")
root.geometry("600x200")

tk.Label(root, text="年").pack()
year_entry = tk.Entry(root)
year_entry.pack()

tk.Label(root, text="月").pack()
month_entry = tk.Entry(root)
month_entry.pack()

tk.Label(root, text="日").pack()
day_entry = tk.Entry(root)
day_entry.pack()

tk.Button(
    root,
    text="米雇用統計発表日からのオフセットを表示",
    command=show_offset,
).pack()

offset_label = tk.Label(root, text="")
offset_label.pack()

root.mainloop()

解説

f”{offset:+d}”

offset_label.config(text=f"{offset:+d}")

:+d は、Python のフォーマット指定子で 「符号を必ず表示する」 という意味になります。 正の値は +5、負の値は -3、ゼロは +0 のように、必ず符号が付きます。

実行結果

Auto Py to Exe で、Windowsのexeアプリ化して、実行。

HR


人気ブログランキング