山梨県

www.pref.yamanashi.jp

このデータをデータラングリングする気にならない

とりあえず日付と小計だけ変換

import datetime
import re

import jaconv
import pandas as pd

dt_now = datetime.datetime.now()

def my_parser(s):

    dt_str = jaconv.z2h(s.strip(), kana=False, digit=True, ascii=True)

    y = dt_now.year
    m, d = map(int, re.findall("(\d{1,2})", dt_str))

    return pd.Timestamp(year=y, month=m, day=d)

def df_conv(df):

    df0 = df.iloc[1:, :].copy()

    df0.columns = ["期間", "件数", "内訳"]

    df1 = pd.concat(
        [
            df0["期間"].str.split("~", expand=True).rename(columns={0: "開始", 1: "終了"}),
            df0["内訳"].str.split("、", expand=True),
        ],
        axis=1,
    )

    # 日付に変換
    df1["開始"] = df1["開始"].apply(my_parser)
    df1["終了"] = df1["終了"].apply(my_parser)

    df2 = df1.melt(id_vars=["開始", "終了"]).dropna()

    df3 = (
        df2["value"]
        .str.extract("([0-9,]+)[日件]([0-9,]+)件", expand=True)
        .rename(columns={0: "日", 1: "小計"})
        .astype(int)
    )

    df4 = pd.concat([df2, df3], axis=1)

    df4["日付"] = df4.apply(
        lambda x: x["開始"].replace(day=x["日"])
        if x["終了"].day < x["日"]
        else x["終了"].replace(day=x["日"]),
        axis=1,
    )

    sr = df4.set_index("日付").sort_index().asfreq("D", fill_value=0)["小計"]

    return sr.reset_index()

dfs = pd.read_html("https://www.pref.yamanashi.jp/koucho/coronavirus/info_coronavirus_data.html")

len(dfs)

# 県衛生環境研究所における疑似症例の検査状況
df_insp = df_conv(dfs[1])
df_insp

# 帰国者・接触者相談センター
df_contacts = df_conv(dfs[2])
df_contacts

# 新型コロナウイルス感染症専用相談ダイヤル
df_dial = df_conv(dfs[3])
df_dial