赞
踩
这几天的疫情,学校要求每个同学都要填写问卷。 于是我简单地创建了一个腾讯问卷。 今天辅导员让我统计下哪几位同学没有填写,并且告知以后每天都要统计。
我们班大约有40人, 每天填写问卷的人大约30多人, 如果靠肉眼的传统方法,把填写问卷的名单和大名单一一比对, 找出未填写的人,岂不是眼都要看花了。 更何况想起辅导员说接下来每天都要如此, 简直是费时费力。
我始终信奉一个真理:所有重复性工作都应由程序完成, 哪怕写程序的时间可能都超过了去完成的时间!
挑出未填写的人,本质上就是全部人员与填写人员之间作一个差集的操作,这在python里只是微秒水平的耗时,现实中却需要花费很久。 于是,就开始了写程序解决这个实际问题。
我使用的是腾讯问卷, 在回收数据这里,可以看到所有的填写数据。 由于我多天来使用的是同一份问卷,也就是说这里我的数据是这么多天来全部的,而我的任务是找出每天没有填写的人的名字。
想通过python处理的话,就要把数据拿下来。 这里可以用爬虫去做,但是腾讯已经提供了直接导出的接口,可以把数据导出为.csv(类似于excel)。
python有一个叫pandas的库, 专门用于处理excel,csv这种格式的文件。 之前在做股票信息的时候用过,这里就第一时间想到了,做这个任务用pandas再合适不过。
腾讯问卷导出的csv如下:
import pandas as pd
csv = pd.read_csv('2.csv')
将导出的csv文件改名为’2.csv’,就可以非常简单地使用read_csv这个api直接读取csv的信息了。
这里由于pycharm自动缩略了中间的内容,但我们可以知道的是pandas将csv读取成了表格。
接下来首先要完成的任务是,提取出给定日期当天的完成人员名单。
腾讯问卷的时间格式是这样的:
但其实我们不需要知道具体的时刻,只需要日期就可以了。 因此,先用一个简单函数进行处理:
a = lambda m:m[:2]
csv['开始答题时间'] = csv['开始答题时间'].apply(a)
先自定义一个lambda函数,效果是截取字符串的前两位。 然后用apply函数将其使用到“开始答题时间”这一列。
这样,开始答题时间就会只剩下前两位,也就是日期, 如2月25日的数据,开始答题时间就是25。 接下来我们再通过这个数据进行筛选。
today = '25'
today_finish = csv['2.姓名'][csv['开始答题时间']==today]
比如我要找今天(2月25日)的完成名单,就将today赋值为’25’,第二个语句就是提取出csv中“姓名”这一列中, “开始答题时间”为25的元素。 前一个中括号指定了要提取的列,后一个中括号再给出了一个筛选条件,最后得到的就是开始答题时间是今天的名单。
接下来,我问辅导员要了全班人的名册,也是excel格式。 出于方便,将其命名为"1.xlsx”.
s = pd.read_excel('1.xlsx')
total = s['姓名'].values
not_finish = set(total).difference(set(today_finish))
同样,用pandas读取后, 第二句使用pandas,提取出excel中包含的姓名,也就是全员名单。 最后,使用set(),将全员名单和我们刚刚提取的今天已完成的人员名单都转换为集合后, 再用集合的方法difference,得到两者的差集。 而这差集,也就正是今天未完成的人的名单。
import pandas as pd csv = pd.read_csv('2.csv') a = lambda m:m[:2] csv['开始答题时间'] = csv['开始答题时间'].apply(a) today = '25' today_finish = csv['2.姓名'][csv['开始答题时间']==today] s = pd.read_excel('1.xlsx') total = s['姓名'].values not_finish = set(total).difference(set(today_finish)) print(not_finish)
整体代码如上, 非常简洁。 运行效率也很高,这样就代替了人工的劳动,节约了许多时间。 如果说要懒到极致的话,应该再写一个爬虫自动导出问卷数据,毕竟现在只能手动导出再手动保存,还不够全自动化。不过也已经够省时了。 我认为代码不应该追求用多高深的语法,一切代码的目的都只有一个,那就是在处理重复性工作时更高的效率。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。