出勤カレンダー

import pandas as pd

year = "2022"

def make_cal(df0, fn):

    df1 = df0.pivot(
        index=["remainder"], columns=["month", "quotient"], values=["day", "value"]
    )
    df1.columns = df1.columns.reorder_levels(order=[1, 2, 0])
    df1.sort_index(axis=1, inplace=True)

    df1.insert(12 + 0, "セパ1", pd.NA)
    df1.insert(24 + 1, "セパ2", pd.NA)
    df1.insert(36 + 2, "セパ3", pd.NA)
    df1.insert(48 + 3, "セパ4", pd.NA)

    df1.to_csv(fn, encoding="utf_8_sig", index=False, header=False)

# 祝日
holidays = pd.read_csv(
    "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv",
    encoding="cp932",
    index_col=0,
    parse_dates=True,
    header=None,
    names=["date", "holiday"],
    skiprows=1,
)

# 365日
df_dates = pd.date_range(f"{year}-01-01", f"{year}-12-31", freq="D")

df0 = pd.DataFrame(index=df_dates).join(holidays)

df0["month"] = df0.index.month
df0["day"] = df0.index.day
df0["weekday"] = df0.index.weekday

df0["week"] = (df0["day"] - 1) // 7
df0["quotient"] = (df0["day"] - 1) // 16
df0["remainder"] = (df0["day"] - 1) % 16

df0["value"] = "出"

df1 = df0.copy()

# 日曜日だけ休み
df1["value"].mask(df1["weekday"] == 6, "休", inplace=True)

make_cal(df1, f"{year}_SUNx.csv")

# 第2・4休み
df1["value"].mask(
    (df1["weekday"] == 5) & ((df1["week"] == 1) | (df1["week"] == 3)), "休", inplace=True
)

make_cal(df1, f"{year}_SUNxSAT24.csv")

# 祝日休み
df1["value"].mask(df1["holiday"].notna(), "休", inplace=True)

make_cal(df1, f"{year}_SUNxSAT24HOLx.csv")

# 土曜日休み
df1["value"].mask(df1["weekday"] > 4, "休", inplace=True)

make_cal(df1, f"{year}_SUNxSATxHOLx.csv")