def make_summaries(self) -> None: # 最終データの日の次の日を最終更新日とする # last_update = ( # self.main_summary_sheet.cell(row=self.summary_count - 1, column=1).value + # timedelta(days=1) # ).strftime("%Y/%m/%d %H:%M") last_update = self.last_update # patients_summaryとinspections_summaryを同時に生成する # スクリプト実行時間短縮のため、同時に生成している。 self._patients_summary_json = template_json(last_update) self._inspections_summary_json = template_json(last_update) for i in range(summary_first_cell, self.summary_count): date = self.main_summary_sheet.cell( row=i, column=1).value + timedelta(hours=8) # 陽性患者数を取得する patients = self.main_summary_sheet.cell(row=i, column=4).value # 検査人数を取得する inspections = self.main_summary_sheet.cell(row=i, column=2).value # Excelのセル内に0すら入っていないときはNoneが返ってくるので、0を代入しなおす。 if patients is None: patients = 0 if inspections is None: inspections = 0 self._patients_summary_json["data"].append( make_data(date.isoformat() + "Z", patients)) self._inspections_summary_json["data"].append( make_data(date.isoformat() + "Z", inspections))
def make_contacts(self) -> None: # 最終データの日の次の日を最終更新日とする # last_update = ( # self.contacts_sheet.cell(row=self.contacts_count - 1, column=1).value + # timedelta(days=1) # ).strftime("%Y/%m/%d %H:%M") last_update = self.last_update # contacts_summaryとhealth_center_summaryを同時に生成する。 # スクリプト実行時間短縮のため、同時に生成している。 self._contacts_summary_json = template_json(last_update) self._health_center_summary_json = template_json(last_update) column_name = self.contacts_sheet.cell(row=contacts_first_cell - 1, column=2).value.replace( "\n", "") health_center_field = 6 for i in range(contacts_first_cell, self.contacts_count): # 日時の取得 # date = excel_date(self.contacts_sheet.cell(row=i, column=1).value) date = self.contacts_sheet.cell( row=i, column=1).value + timedelta(hours=8) if "健康相談窓口" in column_name and "帰国者・接触者相談センター" in column_name: # 日別窓口(相談センター)相談者数の取得 contacts = self.contacts_sheet.cell(row=i, column=2).value # Excelのセル内に0すら入っていないときはNoneが返ってくるので、0を代入しなおす。 if contacts is None: contacts = 0 health_center_field = 4 else: # 日別窓口相談者数の取得 window_contacts = self.contacts_sheet.cell(row=i, column=2).value # 日別帰国者・接触者コールセンター相談者数の取得 center_contacts = self.contacts_sheet.cell(row=i, column=4).value # Excelのセル内に0すら入っていないときはNoneが返ってくるので、0を代入しなおす。 if window_contacts is None: window_contacts = 0 if center_contacts is None: center_contacts = 0 contacts = window_contacts + center_contacts # 日別保健所・保健センター相談者数の取得 health_center = self.contacts_sheet.cell( row=i, column=health_center_field).value # Excelのセル内に0すら入っていないときはNoneが返ってくるので、0を代入しなおす。 if health_center is None: health_center = 0 self._contacts_summary_json["data"].append( make_data(date.isoformat() + "Z", contacts)) self._health_center_summary_json["data"].append( make_data(date.isoformat() + "Z", health_center))
def make_summaries(self) -> None: # 最終データの日の次の日を最終更新日とする last_update = ( self.main_summary_sheet.cell(row=self.summary_count - 1, column=1).value + timedelta(days=1) ).strftime("%Y/%m/%d %H:%M") # patients_summaryとinspections_summaryを同時に生成する # スクリプト実行時間短縮のため、同時に生成している。 self._patients_summary_json = template_json(last_update) self._inspections_summary_json = template_json(last_update) for i in range(summary_first_cell, self.summary_count): date = self.main_summary_sheet.cell(row=i, column=1).value + timedelta(hours=8) # 陽性患者数を取得する patients = self.main_summary_sheet.cell(row=i, column=4).value # 検査人数を取得する inspections = self.main_summary_sheet.cell(row=i, column=2).value self._patients_summary_json["data"].append(make_data(date.isoformat() + "Z", patients)) self._inspections_summary_json["data"].append(make_data(date.isoformat() + "Z", inspections))
def make_patients(self) -> None: # HTMLから最終更新日を取得する last_update_str = [ x.get_text() for x in self.patients_html.find_all("p") if "更新日" in x.get_text() ][0][4:] last_update = datetime.strptime(last_update_str, "%Y年%m月%d日").strftime("%Y/%m/%d %H:%M") # patientsを生成する self._patients_json = template_json(last_update) # patientsは現状HTMLの表を使用して作成しているので、テーブル(レコード一覧)を取得する tables = self.patients_html.find_all("tr") # レコード(セル一覧)を取得する for cells in tables: # データの初期化 data = {} # セルを取得する for i, cell in enumerate(cells.find_all("td")): # 何もないセルは"\u3000"が埋め込まれているのでリプレースして消す text = cell.get_text().replace("\u3000", "") # カラム名は飛ばす if text == "番号": # i == 0と同意 break # 日付を取得する elif i == 1: try: date = datetime.strptime( "2020年" + text, "%Y年%m月%d日") + timedelta(hours=8) data["判明日"] = date.isoformat() + "Z" data["date"] = date.strftime("%Y-%m-%d") except Exception: data["判明日"] = None data["date"] = None # 年代を取得する elif i == 2: data["年代"] = text + "代" # 性別を取得する elif i == 3: data["性別"] = text # 備考を取得する elif i == 5: # 市外在住を除外するため、備考欄を利用 if text == "市外在住": # 下のif文で引っかからないようデータを初期化 data = {} break data["備考"] = text if text != "\xa0" and text else None if data: data["退院"] = None # TODO: 退院データが現状ないため保留 self._patients_json["data"].append(data) # 市外発表者も含むため、日時順でソート self._patients_json["data"].sort( key=lambda x: (x["date"] is None, x["date"]))