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


    用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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如果当天做了核酸,用1表示,如果当天未做核酸,用0表示。
    8月的日期使用Python标准库datetime生成。(datetime用法介绍可以参考文末的相关阅读)
    制作日历
    本文使用Python库openpyxl在excel表格中生成日历。
    1.使用openpyxl创建表格

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

    openpyxl是Python中用于读写excel文件的库,pip install openpyxl安装即可使用。(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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    定义一个将表格颜色填充成白色的函数,对表格初始化处理,将背景设置成纯白,日历看起来更美观。
    定义一个用于处理单元格格式的函数,后面直接调用函数给单元格设置格式,方便重复使用。
    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    日历效果:
    在这里插入图片描述
    可以看到,8月份我只有4天没有做核酸,大部分时间都是保持24小时。
    代码实现介绍:

    • 先合并首行的前7列单元格,写入年月,然后在第二行从左到右写入星期一到星期日,并设置格式。
    • 使用Python的日历库calendar返回当前月第一天是星期几,然后确定日历的1号的起始位置。(calendar用法介绍可以参考文末的相关阅读)
    • 从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')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    日历效果:
    在这里插入图片描述
    pyecharts中的Calendar组件也可以实现日历可视化,不过格式比较固定,展示得比较密集。
    总结:

    • 本文用python制作了核酸检测的日历,对核酸检测的天数进行可视化。
    • 本文用了两种方式实现一年的日历展示。
    • 代码获取方式,用WX在下方点击二维码关注,并在后台回复“核酸日历”可以获取完整代码。

    以上就是本文的全部内容,如果你觉得这个日历做得还行,欢迎点赞、评论和收藏。

    相关阅读:
    Python time和datetime时间戳和时间字符串相互转换
    Python使用openpyxl模块读写excel文件
    Python calendar日历模块的常用方法

  • 相关阅读:
    实现顺序表
    bugku web篇(二)
    全栈开发实战|Vue进阶——使用静态模块打包工具webpack
    《机器学习——数学公式推导合集》1. 最小二乘法(least square method)求解线性模型
    Vue学习:vue生命周期
    第一百四十五回 如何给组件添加阴影
    【Spatial-Temporal Action Localization(三)】论文阅读2018年
    IDL学习:语法基础-结构体
    Redis-渐进式遍历scan的使用
    perl uc,lc,ucfirst,lcfirst大小写转换函数
  • 原文地址:https://blog.csdn.net/weixin_43790276/article/details/126615471