このデータをデータラングリングする気にならない
とりあえず日付と小計だけ変換
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