首頁  >  文章  >  後端開發  >  用Python製作我的核酸檢測日曆

用Python製作我的核酸檢測日曆

王林
王林轉載
2023-05-10 14:19:06791瀏覽

用Python製作我的核酸檢測日曆

我的座標是深圳,2022年以來,大部分時候要求24小時,少部分時候要求48小時,更少的時候要求72小時,沒有更長的情況。

本文根據我的核酸檢測記錄,製作成日曆,將核酸檢測記錄視覺化到日曆中。

輸入資料

核酸檢測記錄能查到的最早時間範圍是一個月,以前的檢測記錄沒有事先保存,所以先用8月份的資料製作日曆。

查詢8月份的偵測記錄,錄入程式碼。

# coding=utf-8
from datetime import datetime
# 核酸检测数据,1表示当天做了核酸,0表示当天未做核酸
my_nucleic = {
 'date': [datetime.strftime(datetime(2022, 8, i+1), '%Y-%m-%d') for i in range(31)],
 'nucleic': [1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
}

如果當天做了核酸,用1表示,如果當天沒有做核酸,用0表示。

8月的日期使用Python標準函式庫datetime產生。

製作日曆

本文使用Python庫openpyxl在excel表格中產生日曆。

1.使用openpyxl建立表格

import openpyxl
# 创建一个workbook对象,而且会在workbook中至少创建一个表worksheet
wb = openpyxl.Workbook()
# 获取当前活跃的worksheet,默认就是第一个worksheet
ws = wb.active

openpyxl是Python中用來讀寫excel檔案的函式庫,pip install openpyxl安裝即可使用。

2.定義表格初始化和單元格設定的函數

from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
def init_sheet(ws):
 for r in range(100):
 for c in range(100):
 ws.cell(row=r+1, column=c+1).fill = PatternFill('solid', fgColor='000000')
def set_cell_style(ws, r, c, color):
 ws.cell(row=r, column=c).fill = PatternFill('solid', fgColor=color)
 ws.cell(row=r, column=c).font = Font(name="微软雅黑", size=14, bold=True)
 ws.cell(row=r, column=c).alignment = Alignment(horizontal='right', vertical='center')
 side = Side(style="medium", color="004B3C")
 ws.cell(row=r, column=c).border = Border(top=side, bottom=side, left=side, right=side)

#定義一個將表格顏色填入白色的函數,對表格初始化處理,將背景設定成純白,日曆看起來更美觀。

定義一個用於處理單元格格式的函數,後面直接呼叫函數給單元格設定格式,方便重複使用。

3.實作行事曆

import calendar
# 将表格填充成白色
init_sheet(ws)
# 设置年月单元格的边框
side = Side(style="medium", color="004B3C")
for col in range(7):
 ws.cell(row=1, column=col+1).border = Border(top=side, bottom=side, left=side, right=side)
# 合并年月单元格
ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=7)
# 写入内容和设置格式
ws.cell(row=1, column=1).value = '2022年8月'
set_cell_style(ws, r=1, c=1, color='418CFA')
# 写入星期一至星期日,并设置格式
title_data = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
for col in range(7):
 ws.cell(row=2, column=col+1).value = title_data[col]
 set_cell_style(ws, r=2, c=col+1, color='418CFA')
# 获取一个月的天数和第一天是星期几
monthday = calendar.monthrange(2022, 8)
# 设置日历的日期
col, row = monthday[0], 3
for i in range(len(my_nucleic['date'])):
 if col < 7:
 ws.cell(row=row, column=col + 1).value = i+1
 col += 1
 else:
 col = 0
 row += 1
 ws.cell(row=row, column=col + 1).value = i+1
 col += 1
 # 设置单元格格式
 set_cell_style(ws, r=row, c=col, color='000000')
 # 根据核酸结果填充颜色
 if my_nucleic['nucleic'][i] == 1:
 ws.cell(row=row, column=col).fill = PatternFill('solid', fgColor='009B3C')
# 设置行高
for i in range(1, row+1):
 ws.row_dimensions[i].height = 30
# 保存表格
wb.save(filename='show_august_nucleic.xlsx')
wb.close()

行事曆效果:

用Python製作我的核酸檢測日曆

可以看到,8月份我只有4天沒有做核酸,大部分時間都是維持24小時。

程式碼實現介紹:

  •  先合併首行的前7列單元格,寫入年月,然後在第二行從左到右寫入星期一到星期日,並設定格式。
  •  使用Python的日曆庫calendar返回目前月第一天是星期幾,然後確定日曆的1號的起始位置。
  •  從1號開始,依序在excel中寫入日期,當欄位到達星期日時,換行並回到星期一的欄位。
  •  依照當天是否做了核酸,為儲存格填滿背景顏色。本文如果當天做了核酸,則日期的背景設定為綠色(24小時核酸碼的顏色),如果未做核酸,則日期的背景設定為白色。
  •  最後將結果儲存到excel檔案中,開啟excel檔案即可看到製作的行事曆。

製作一年的日曆

製作了一個月的日曆後,繼續擴展做一年的日曆,先看一下效果:

用Python製作我的核酸檢測日曆

用Python製作我的核酸檢測日曆

實作方式介紹:

  •  資料補充,由於只能查到一個月的核酸記錄,所以本文除2022年8月外,其他月份的數據用隨機數產生。
  •  將製作一個月日曆的程式碼進行封裝,傳入年和月,就可以產生任何一個月的日曆。
  •  在excel檔案中,自己設計一排展示幾個月,本文一排展示3個月。並計算每個月日曆的起始儲存位置。
  •  最後傳入年份,依序將一年12個月的日曆製作出來,展示在一個頁面上。只要有數據,可以對任意一年的日曆進行視覺化。 (程式碼較長,可在文末取得完整程式碼)

按年的另一種展示方式:

from pyecharts import options as opts
from pyecharts.charts import Calendar
import pandas as pd
nucleic_df = pd.DataFrame()
for i in range(12):
 month_nucleic = made_data(2022, i+1)
 month_df = pd.DataFrame(month_nucleic)
 nucleic_df = pd.concat([nucleic_df, month_df])
data = [[row_data['date'], row_data['nucleic']] for row_index, row_data in nucleic_df.iterrows()]
cal = Calendar(init_opts=opts.InitOpts(width='900px', height='500px'))
cal.add(
 '', data, calendar_opts=opts.CalendarOpts(range_="2022",
 daylabel_opts=opts.CalendarDayLabelOpts(first_day=1, name_map='cn'))
).set_series_opts(
 label_opts=opts.LabelOpts(font_size=12)
).set_global_opts(
 title_opts=opts.TitleOpts(title='核酸检测日历', pos_left='450', pos_top='0',
 title_textstyle_opts=opts.TextStyleOpts(color='black', font_size=16)),
 visualmap_opts=opts.VisualMapOpts(
 max_=1, min_=0, orient="horizontal", is_piecewise=False,
 range_color=["white", "white", "green"], pos_top="250px", pos_left='50px'
 ),
).render('my_nucleic.html')

行事曆效果:

用Python製作我的核酸檢測日曆

pyecharts中的Calendar元件也可以實現日曆視覺化,不過格式比較固定,展示得比較密集。

總結

  •  本文以python製作了核酸檢測的日曆,對核酸檢測的天數進行視覺化。
  •  本文花了兩種方式實現一年的日曆展示。
  •  需要原始碼,直接公眾號後台輸入:小助手,暗號「核酸日曆」可以取得完整程式碼。

以上是用Python製作我的核酸檢測日曆的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除