【Python】祝日情報を追加する


目的

時系列データの分析で曜日依存について検証するとき、祝日情報も追加したい。

ゴール

時系列データフレームの日付列に対し dt.weekday で 曜日列"weekday" 追加し 月:0、火:1、水:2、木:3、金:4、土:5、日:6 とした後、祝日該当日に 祝:7 を上書きする。
さらに、カレンダーでは平日となっている年末年始休暇期間など経済活動が休日モードになっている日も任意に 祝:7 として扱えるようにする。

実践

import pandas as pd

2019年→2020年の年末年始を含む期間の日時情報のデータフレーム "df" を処理

# 日付列"date"をタイムスタンプ型にする
df["date"] = pd.to_datetime(df["date"])

# 曜日情報列"weekday"をデータフレームに追加
df["weekday"] = df["date"].dt.weekday

年末年始休暇期間中(2019-12-30:月曜、2019-12-31大晦日:火曜、2020-01-01元旦:水曜、2020-01-02:木曜、2020-01-03:金曜)は全て平日判定👇

1955年以降の日本の祝日がリストアップされたcsvデータが取得できる内閣府webページ『国民の祝日について』から祝日データ "syukujitsu.csv" を読み込み
!!ATTN!!
"syukujitsu.csv" は厳密な祝日しかリストアップされていない(年末年始休暇期間やお盆休みなど経済活動が休日モードな平日は別途定義してリストへ任意追加する必要あり)

# "syukujitsu.csv"読み込み
syukujitsu = pd.read_csv("https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv", encoding="SHIFT-JIS")

# "国民の祝日・休日月日"列をタイムスタンプ型にする
syukujitsu["国民の祝日・休日月日"] = pd.to_datetime(syukujitsu["国民の祝日・休日月日"])

2019年→2020年の年末年始期間を絞って表示すると、元旦のみ上がってくる👇

経済が休日モードの大晦日や三が日も祝日と同様に扱いたい!
 → 祝日同様に扱いたい休日をリストアップしてデータフレームにする

# 年末年始休暇の追加休日リスト"add"
add = ["2019/12/30", "2019/12/31", "2020/1/2", "2020/1/3"]

# 追加休日リストをデータフレーム"ADD"にする
ADD = pd.DataFrame(add, columns=["国民の祝日・休日月日"])
ADD["国民の祝日・休日月日"] = pd.to_datetime(ADD["国民の祝日・休日月日"])

内閣府の祝日データフレームに、作成した追加休日データフレームを結合して、祝日データフレームを更新

# "syukujitsu"と"ADD"を結合して更新した祝日データフレーム"syuku"
syuku = pd.concat([syukujitsu, ADD]).sort_values("国民の祝日・休日月日").reset_index(drop=True)

2019年→2020年の年末年始に期間を絞って表示すると、元旦を含む年末年始休暇期間も祝日として上がってきた👇

日時情報のデータフレーム "df" の曜日情報列に対し、更新した祝日データフレーム"syuku"でリストアップした日に 祝:7 を付与する

# 祝日フラグ7を該当日に付与する
for i in syuku["国民の祝日・休日月日"]:
    df["weekday"].mask(df["date"] == i, 7, inplace=True)

祝日データフレームで指定した日の"weekday"を7に上書き完了👇