目录
我的坐标是深圳,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制作了核酸检测的日历,对核酸检测的天数进行可视化。
- 本文用了两种方式实现一年的日历展示。
© 版权声明
THE END
暂无评论内容