专栏首页张国平_玩转树莓派Python+Excel数据分析实战:军事体能考核成绩评定(二)基本框架和年龄计算
原创

Python+Excel数据分析实战:军事体能考核成绩评定(二)基本框架和年龄计算

一、基本框架

项目任务

每个人的体能测试有单杠、仰卧起坐、30米x2蛇形跑、3000米跑四个项目,外加体型是否合格(BMI身体质量指数或者PBF体脂百分比),每项原始测试数据,通过不同项目各自规定的标准转换成100分制的分数,最终汇总得出个人的评定成绩,而且能够批量计算。

输入原始数据举例

算法思路

1.总体思路。通过读取Excel表上该行人员的性别、年龄、海拔数据(计算3000米跑才需要,其它项目不需要),和原始成绩,去查询该项“成绩计算标准表”,得到对应的分数,将分数写入该项目“换算成绩”一列中。循环计算完所有的列。

2.制作成绩计算标准表。通过分析各项“成绩计算标准表”,发现标准表只是参照标准表,不是连续的全覆盖,以男子引体向上成绩计算标准为例,标准中24岁以下,只规定了单杆30个100分,27个95分,那么28/29个的情况多少分呢?

男子引体向上成绩计算标准表

只能是我们根据公平原则去补充,在30/27之间去取平均分,这可以通过代码自动换算(3000米跑),也可以手工计算(引体向上、仰卧起坐等),补充到成绩计算标准表里,精确到小数点后一位。

男子单杠补充标准表

3.读取成绩计算标准表。通过Python的openpyxl模块读取补充成绩计算标准表中的数据,制成 {原始单杠个数:分数} 格式的字典,以供查询。

二、年龄计算

我认为编程有一个基本原则,就是做一步,验证一步,否则代码积累很多之后再验证正确性,BUG就可能非常复杂,难以排除。

所以要能够及时验证计算的正确性,就将计算的几个要素一开始就纳入进来,性别、海拔、原始成绩都可以直接读取,但是年龄是动态的,不同时间组织的考核,人员的年龄会可能不同,最佳方式就是通过出生日期,即时计算出人员在考核时的年龄,能够精确到天。

通用训练课目考核成绩计算.xlsx

函数calculate_age(born),参数born是出生日期,函数返回的就是年龄值。

import openpyxl  # 导入openpyxl模块
import datetime as dt

# 打开Excel文件'通用训练课目考核成绩计算.xlsx'
wb=openpyxl.load_workbook('通用训练课目考核成绩计算.xlsx') 
# 打开Excel文件中的工作簿“体能考核成绩”
ws_training_performance = wb['体能考核成绩']

def calculate_age(born):
    '''由出生日期计算年龄,精确到天'''
    today =dt.datetime.today()  #程序运行时的时间,即现在的时间
    # today = today.replace(year=2020)   #用于测试不同年份时的情况
    # print(born)
    try:
        birthday = born.replace(year = today.year)
    except ValueError:
        # 出生日期是2月29日但若今年不是润年时,29要减1天为28天
        birthday = born.replace(year=today.year, day=born.day-1)
    # print(birthday)
    if birthday > today:
        return today.year - born.year - 1  #生日的月日大于今天的月日,则今天不满周岁,要减1
    else:
        return today.year - born.year  #生日的月日小于或等于今天的月日,则已满周岁,不用减1

#iter_rows方法截取的表格数据从原表第6行,第2列(B列)开始
rngs = ws_training_performance.iter_rows(min_row=6,min_col=2)
for row in rngs:      #截取的表格数据逐行循环
    if row[3].value:  #生日数据不为空,则对这一行的生日数据进行处理,row[n]中的n从0开始
        # print(row[3].value)
        age = calculate_age(row[3].value)    # 由出生日期计算年龄,精确到天
        row[4].value = age  #将年龄值写入到表中的年龄表格中

wb.save('计算结果.xlsx')

运行上面的代码,生成一个Excel文件“计算结果.xlsx”:

计算结果.xlsx

这里实现了年龄自动计算的功能,但代码的健壮性不足,比如出生日期的格式如果不对,会弹出错误,这将在后面的工作中逐步完善。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python+Excel数据分析实战:军事体能考核成绩评定(二)基本框架和年龄计算

    每个人的体能测试有单杠、仰卧起坐、30米x2蛇形跑、3000米跑四个项目,外加体型是否合格(BMI身体质量指数或者PBF体脂百分比),每项原始测试数据,通过不同...

    张国平
  • 第二章 计算概述

      本章从一个宽泛的高级视角对计算机如何工作,以及完成这些工作用到哪些计算机部件的问题进行了阐述。

    张国平
  • 树莓派基础实验16:霍尔传感器实验

       霍尔传感器是根据霍尔效应制作的一种磁场传感器。霍尔效应是磁电效应的一种,这一现象是霍尔(A.H.Hall,1855—1938)于1879年在研究金属的导电...

    张国平
  • Python+Excel数据分析实战:军事体能考核成绩评定(二)基本框架和年龄计算

    每个人的体能测试有单杠、仰卧起坐、30米x2蛇形跑、3000米跑四个项目,外加体型是否合格(BMI身体质量指数或者PBF体脂百分比),每项原始测试数据,通过不同...

    张国平
  • Docker官方centos镜像下安装elasticsearch【详细步骤】

    这里启动容器选择了一段ip和主机ip映射「-p 9000-9900:9000-9900」可以使用docker port 命令查看具体映射 1docker...

    XING辋
  • 深入浅出Kotlin协程

    协程(Coroutines)已经随着Kotlin1.3版本一起发布了1.0正式版,android平台可以使用如下方式引入:

    wiizhang
  • C++ 类之间的互相调用

    这几天做C++11的线程池时遇到了一个问题,就是类A想要调用类B的方法,而类B也想调用类A的方法 这里为了简化起见,我用更容易理解的观察者模式向大家展开陈述 观...

    magicsoar
  • TED视频 | 混搭人文主义,我找到了数据可视化的新玩法

    大数据文摘
  • Andrew Ng机器学习课程笔记(一)之线性回归

    http://www.cnblogs.com/fydeblog/p/7364598.html

    努力努力再努力F
  • 010.python科学计算库seaborn(下)

    版权声明:本文为博主原创文章,允许转载,请标明出处。 https://blog.csdn.net/qwdafedv/article/deta...

    qubianzhong

扫码关注云+社区

领取腾讯云代金券