ヘビに睨まれたカエル

Pythonとオプショントレードで市場の恐怖に立ち向かっていきます。

Pythonで祝日(リスト形式)を取得する

何かと営業日ベースで計算する機会が多い(n営業日後、とか)ので、祝日をリスト形式で取得するモジュールを用意しておくことにしました。 Pythonにはworkdaysというライブラリがあり、土日を考慮した計算ならコレでできるのですが、祝日はworkdays関数の引数の一つとして自分でリストを与えてやる必要があるためです。

  • 事前準備

内閣府HP からsyukujitsu.csvを予めダウンロードしておく。 別にコレも都度プログラムでWebを参照するようにしてもいいのですが、2年分の祝日が乗っているので、2年に1回くらいなら手動ダウンロードでもいっか、と思いました。

syukujitsu.csvの中身はこんな感じ。1列目に月日、2列目に祝日の名称が書かれています。

国民の祝日・休日月日,国民の祝日・休日名称
2019/1/1,元日
2019/1/14,成人の日
2019/2/11,建国記念の日
2019/3/21,春分の日
2019/4/29,昭和の日
2019/4/30,休日
2019/5/1,休日(祝日扱い)
2019/5/2,休日
2019/5/3,憲法記念日
2019/5/4,みどりの日
2019/5/5,こどもの日
2019/5/6,休日
2019/7/15,海の日
2019/8/11,山の日
2019/8/12,休日
2019/9/16,敬老の日
2019/9/23,秋分の日
2019/10/14,体育の日(スポーツの日)
2019/10/22,休日(祝日扱い)
2019/11/3,文化の日
2019/11/4,休日
2019/11/23,勤労感謝の日
2020/1/1,元日
2020/1/13,成人の日
2020/2/11,建国記念の日
2020/2/23,天皇誕生日
2020/2/24,休日
2020/3/20,春分の日
2020/4/29,昭和の日
2020/5/3,憲法記念日
2020/5/4,みどりの日
2020/5/5,こどもの日
2020/5/6,休日
2020/7/23,海の日
2020/7/24,スポーツの日
2020/8/10,山の日
2020/9/21,敬老の日
2020/9/22,秋分の日
2020/11/3,文化の日
2020/11/23,勤労感謝の日

  • モジュール内でやること

    1. syukujitsu.csvの日付の行をリストで取得。
    2. daytime形式に変換。(np.vectorizeでリストにいっぺんに関数を適用できる)
    3. tolist()でリスト形式に戻しておく。(np.vectorizeするとarray形式になってしまうため)
  • プログラム

df_holidays = pd.read_csv("syukujitsu.csv", delimiter=",", encoding="SHIFT=JIS")
ser_holidays = df_holidays["国民の祝日・休日月日"].tolist()

ser_holidays = np.vectorize(dt.datetime.strptime)(ser_holidays, '%Y/%m/%d')

ser_holidays = ser_holidays.tolist()
ser_holidays

実行結果はこんな感じ。datetime形式のリストになってます。

[datetime.datetime(2019, 1, 1, 0, 0),
datetime.datetime(2019, 1, 14, 0, 0),
datetime.datetime(2019, 2, 11, 0, 0),
datetime.datetime(2019, 3, 21, 0, 0),
datetime.datetime(2019, 4, 29, 0, 0),
datetime.datetime(2019, 4, 30, 0, 0),
datetime.datetime(2019, 5, 1, 0, 0),
datetime.datetime(2019, 5, 9, 0, 0),
datetime.datetime(2019, 5, 10, 0, 0),
datetime.datetime(2019, 5, 4, 0, 0),
datetime.datetime(2019, 5, 5, 0, 0),
datetime.datetime(2019, 5, 6, 0, 0),
datetime.datetime(2019, 7, 15, 0, 0),
datetime.datetime(2019, 8, 11, 0, 0),
datetime.datetime(2019, 8, 12, 0, 0),
datetime.datetime(2019, 9, 16, 0, 0),
datetime.datetime(2019, 9, 23, 0, 0),
datetime.datetime(2019, 10, 14, 0, 0),
datetime.datetime(2019, 10, 22, 0, 0),
datetime.datetime(2019, 11, 3, 0, 0),
datetime.datetime(2019, 11, 4, 0, 0),
datetime.datetime(2019, 11, 23, 0, 0),
datetime.datetime(2020, 1, 1, 0, 0),
datetime.datetime(2020, 1, 13, 0, 0),
datetime.datetime(2020, 2, 11, 0, 0),
datetime.datetime(2020, 2, 23, 0, 0),
datetime.datetime(2020, 2, 24, 0, 0),
datetime.datetime(2020, 3, 20, 0, 0),
datetime.datetime(2020, 4, 29, 0, 0),
datetime.datetime(2020, 5, 3, 0, 0),
datetime.datetime(2020, 5, 4, 0, 0),
datetime.datetime(2020, 5, 5, 0, 0),
datetime.datetime(2020, 5, 6, 0, 0),
datetime.datetime(2020, 7, 23, 0, 0),
datetime.datetime(2020, 7, 24, 0, 0),
datetime.datetime(2020, 8, 10, 0, 0),
datetime.datetime(2020, 9, 21, 0, 0),
datetime.datetime(2020, 9, 22, 0, 0),
datetime.datetime(2020, 11, 3, 0, 0),
datetime.datetime(2020, 11, 23, 0, 0)]

次はこれ使って、SQ日や残存日数を自動計算するモジュール作る!!