利用Python制作简易的核酸检测日历
作者:小斌哥r 发布时间:2022-02-04 00:55:53
我的坐标是深圳,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()
日历效果:
可以看到,8月份我只有4天没有做核酸,大部分时间都是保持24小时。
代码实现介绍:
先合并首行的前7列单元格,写入年月,然后在第二行从左到右写入星期一到星期日,并设置格式。
使用Python的日历库calendar返回当前月第一天是星期几,然后确定日历的1号的起始位置。
从1号开始,依次在excel中写入日期,当列到达星期日时,换行并回到星期一的列。
根据当天是否做了核酸,给单元格填充背景颜色。本文中如果当天做了核酸,则日期的背景设置为绿色(24小时核酸码的颜色),如果未做核酸,则日期的背景设置为白色。
最后将结果保存到excel文件中,打开excel文件即可看到制作的日历。
制作一年的日历
制作了一个月的日历后,继续扩展做一年的日历,先看一下效果:
实现方式介绍:
数据补充,由于只能查到一个月的核酸记录,所以本文除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')
日历效果:
pyecharts中的Calendar组件也可以实现日历可视化,不过格式比较固定,展示得比较密集。
本文用python制作了核酸检测的日历,对核酸检测的天数进行可视化。
本文用了两种方式实现一年的日历展示。
来源:https://mp.weixin.qq.com/s/g73rLFc8g_O5DsPNlkGqyA


猜你喜欢
- 发一个数字拼图游戏,有点小疑问前几天写得,其中一段代码还要感谢“簡簡單單愛妳”的提示,不过我还是不太明白, ,有点笨。 $(&qu
- 问题你想读写一个CSV格式的文件。解决方案对于大多数的CSV格式的数据读写问题,都可以使用 csv 库。、例如,假设你在一个名叫stocks
- 导读:《我不是药神》是由文牧野执导,徐峥、王传君、周一围、谭卓、章宇、杨新鸣等主演的喜剧电影,于 2018 年 7 月 6 日在中国上映。影
- 通过exec可以执行动态Python代码,类似Javascript的eval功能;而Python中的eval函数可以计算Python表达式,
- 本文实例分析了JS重载实现方法。分享给大家供大家参考,具体如下:重载是面向对象语言里很重要的一个特性,JS中没有真正的重载,是模拟出来的(因
- 在WEB2.0这个词未出现之前,是没有所谓的WEB1.0之说的,那时候的互联网也是没有时代之分的,能上的网站不多,值得上的网站更不多,很多的
- 1. tqdm的介绍有时候在使用Python处理比较耗时操作的时候,为了便于观察处理进度,这时候就需要通过进度条将处理情况进行可视化展示,以
- 1、吃金币源码分享:import osimport cfgimport sysimport pygameimport randomfrom
- 废话不多说了,具体代码如下所示:function getIntAdd($a,$b){$c = '';$bCount = st
- 前言相信做自动化测试的同学一定不可忽视的问题就是验证码,他几乎是一个网站登录的标配,当然,我一般是不建议在这上面浪费时间去做识别的。举个例子
- 一、前言好不容易女神喊我去看电影,但是她又不知道看啥,那么我当然得准备准备~二、前期准备1、使用的软件python 3.8 开源 免费的 (
- 实验目的:用socket 模拟一个微型的web服务器,当py脚本run起后,实微型web server架起了,然后用本地浏览器访问
- newstudent.asp<script LANGUAGE=″vbscript″ RUNAT=″Server″&
- 一、如何将列表数据写入文件 ⾸先,我们来看看下⾯这段代码,并思考:这段代码有没有问题,如果有问题的话,要怎么改?li = [
- 从cmd进入python的方法如下1进入python打开cmd——>直接输入python即可,如下2退出python方法一:先按Ctr
- Hello 大家好,我是TANZAME,我们又见面了。NuGet是什么这里就不再重复啰嗦,园子里一搜一大把。今天要跟大家分享的是,在日常开发
- 目录1、基础理论1.1 事务1.2 分布式事务2、分布式事务的解决方案2.1 两阶段提交/XA2.2 SAGA2.3 TCC2.4 本地消息
- 以前用js很少用到js的正则表达式,即使用到了,也是诸如邮件名称之类的判断,网上代码很多,很少有研究,拿来即用。最近开发遇到一些需要使用正则
- 【OpenCV】⚠️高手勿入! 半小时学会基本操作 ⚠️ 分水岭算法概述OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大.
- 一、数据导入是所有数模编程的第一步编程求解一个数模问题,问题总会涉及一些数据。有些数据是在题目的文字描述中给出的,有些数据是通过题目的附件文