PHP前端开发

用Python制作我的核酸检测日历

百变鹏仔 1个月前 (01-21) #Python
文章标签 核酸

我的坐标是深圳,2022年以来,大部分时候要求24小时,少部分时候要求48小时,更少的时候要求72小时,没有更长的情况。

本文根据我的核酸检测记录,制作成日历,将核酸检测记录可视化到日历中。

录入数据

核酸检测记录能查到的最早时间范围是一个月,以前的检测记录没有提前保存,所以先用8月份的数据制作日历。

查询8月份的检测记录,录入到代码中。

# coding=utf-8from 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中至少创建一个表worksheetwb = openpyxl.Workbook()# 获取当前活跃的worksheet,默认就是第一个worksheetws = wb.active

openpyxl是Python中用于读写excel文件的库,pip install openpyxl安装即可使用。

2.定义表格初始化和单元格设置的函数

from openpyxl.styles import PatternFill, Font, Alignment, Border, Sidedef 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], 3for i in range(len(my_nucleic['date'])): if col <p>日历效果:<br></p><p style="text-align: center;"><img src="https://img.php.cn/upload/article/000/465/014/168369954862992.jpg" alt="用Python制作我的核酸检测日历"></p><p>可以看到,8月份我只有4天没有做核酸,大部分时间都是保持24小时。<br></p><p>代码实现介绍:<br></p>

制作一年的日历

制作了一个月的日历后,继续扩展做一年的日历,先看一下效果:

实现方式介绍:

按年的另一种展示方式:

from pyecharts import options as optsfrom pyecharts.charts import Calendarimport pandas as pdnucleic_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组件也可以实现日历可视化,不过格式比较固定,展示得比较密集。

总结