目的
時系列データの分析で曜日依存について検証するとき、祝日情報も追加したい。
ゴール
時系列データフレームの日付列に対し 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)