作为教育管理人员,你一定很关心学生的饮食起居吧;作为学生家长,你一定很关心孩子在学校的学习和生活情况吧。

  现在就有一位老师让家长想了解一下学生在学校到食堂就餐的情况,于是就下载了一份Excel工作簿,这份工作簿保存着若干名学生近三个月的刷卡消费记录,每个学生一张工作表。学校每天的早餐时间为6点至8点,午餐时间为11点至13点,晚餐时间为17点至19点。希望能够简便快速地统计每个学生早中晚用餐的消费次数。表格样式如下:

  1.2秒、7240条消费记录,Python一键搞定三餐汇总,告别熬夜!

  1.2秒、7240条消费记录,Python一键搞定三餐汇总,告别熬夜!

  其实,解决此类重复性问题正是Python的拿手好戏。下面就看看Python是解决这个问题的。

  先来看完整代码:

  import pandas as pdimport times_t = time.time()df = pd.read_excel("学生就餐率统计表.xlsx",sheet_name=None,header=0)hz = []xf_count = 0student_count = 0for sht_name,data in df.items(): if"就餐"notin sht_name: d = data.dropna(subset=["操作人"]).copy() d['操作时间'] =pd.to_datetime(d['操作时间'], errors='coerce') xf_count += len(d) student_count += 1 hours = d['操作时间'].dt.hour c1 = ((hours >= 6) & (hours <= 8)).sum() c2 = ((hours >= 11) & (hours <= 13)).sum() c3 = ((hours >= 17) & (hours <= 19)).sum() hz.append([sht_name,c1,c2,c3,c1+c2+c3])dfs = pd.DataFrame(hz,columns = ["姓名","早餐次数","午餐次数","晚餐次数","总次数"])dfs.to_excel("学生就餐汇总.xlsx",index = False)print(f"共{student_count}名学生{xf_count}条记录,用时{time.time()-s_t:.2f}秒")

  再来说结果,Python解决这个问题,共筛选了28名学生的7240条消费记录,生成的汇总表包含“姓名、早餐次数、午餐次数、晚餐次数、用餐总次数”5列信息,用时仅1.27秒。

  1.2秒、7240条消费记录,Python一键搞定三餐汇总,告别熬夜!

  1.2秒、7240条消费记录,Python一键搞定三餐汇总,告别熬夜!

  接下来,咱们再一步一步拆解代码思路,就算你是个编程新手,也能看懂这背后的逻辑。

  第一步,加载模块,读取数据

  import pandas as pdimport times_t = time.time()df = pd.read_excel("学生就餐率统计表.xlsx",sheet_name=None,header=0)

  • pandas是数据清洗分析的利器,read_excel用于加载数据,sheet_name=None这个参数能一次性读取excel里所有的工作表。
  • time是时间模块。s_t = time.time()用于记录代码的开始运行时间,最后能清晰看到整体运行时长,让高效看得见。

      第二步、遍历工作表,自动筛选有效数据

      hz = []xf_count = 0student_count = 0for sht_name,data in df.items(): if "就餐"not in sht_name: d = data.dropna(subset=["操作人"]).copy() d['操作时间'] =pd.to_datetime(d['操作时间'], errors='coerce') xf_count += len(d) student_count += 1

  • hz = []:空列表,用于保存最终筛选出的有效数据。
  • xf_count和student_count用于统计总消费次数和学生人数。
  • for sht_name,data in df.items():遍历所有工作表,sht_name为工作表名,data为工作表的详细数据。df.items()整个工作簿以字典形式保存。
  • if "就餐"not in sht_name:排除无关的表格,排除无效表格的干扰。
  • data.dropna(subset="操作人").copy():删除操作人列为空白的行。如文首图示,操作人即要汇总的学生姓名。copy建立副本。
  • pd.to_datetime(d['操作时间'], errors='coerce'):把操作时间列转为标准时间格式,为后续时间判断排除障碍。

      第三步,按时间分段计数

       hours = d['操作时间'].dt.hour c1 = ((hours>=6) & (hours<=8)).sum() c2 = ((hours>=11) & (hours<=13)).sum() c3 = ((hours>=17) & (hours<=19)).sum() hz.append([sht_name,c1,c2,c3,c1+c2+c3])

  • hours = d['操作时间'].dt.hour:提取时间里的小时。
  • ((hours>=6) & (hours<=8)).sum():&表示和的关系。sum用于自动计算总次数。
  • hz.append([sht_name,c1,c2,c3,c1+c2+c3]):把学生姓名和统计结果存入列表。

      第四步、生成汇总表,显示结果

      dfs = pd.DataFrame(hz,columns = ["姓名","早餐次数","午餐次数","晚餐次数","总次数"])dfs.to_excel("学生就餐汇总.xlsx",index = False)print(f"共{student_count}名学生{xf_count}条记录,用时{time.time()-s_t:.2f}秒")

  • 最后一步就是打包输出,DataFrame把所有学生的统计结果整理成标准的excel表格,to_excel直接把结果保存到电脑里,print告诉读者处理了多少数据,用了多长时间。

      如果你也有类似的问题,只需要对照需要做简单修改就能用。如果你觉得这篇文章对你有所启发,别忘了点赞、转发支持一下,也请大家关注我,后续会分享更多的实用办公技巧,用代码解放双手,把时间留给更重要的事~~~

      本文标题:1.2秒、7240条消费记录,Python一键搞定三餐汇总,告别熬夜!

      本文链接:http://www.hniuzsjy.cn/renwen/57711.html