学以致用,课堂练习:考勤目录中存放的是所有的考勤excel表格,从第1天~第9天,表中关键的信息就是,学生当天看了多久的直播。
要求,利用所学知识,读取每个excel表格,统计出来每个学生,一共看了多久的直播。x小时y分钟,不考虑秒。1、模块化开发;2、先不考虑特别细节的地方。
思路:1.要统计观看总时长,我需要将每个学生的观看信息提取出来;2.要使用字典dist+list的形式,存储每个学生的观看信息。
围绕以上目的,读取所有文件内容,提取需要的信息。
依次读取每个文件,找“xxx”在哪一行,将该行的第二列数据,取出(统一格式后再运算)即可。对每位学生都重复以上操作,即可。
'''
学以致用,课堂练习:考勤目录中存放的是所有的考勤excel表格,从第1天~第9天,表中关键的信息就是,学生当天看了多久的直播。
要求,利用所学知识,读取每个excel表格,统计出来每个学生,一共看了多久的直播。x小时y分钟,不考虑秒。
'''
import pandas as pd
import os
rename = {'aaa': '山水', 'bbb': 'Lee', 'ccc': '琨'}; # 昵称
# 直接拷贝所有的学生姓名
names = ['aaa', 'bbb', 'ccc'];
# print(len(names)) # 73名学生
# 列车所有文件
root = r'C:\Users\lwx\Desktop\考勤';
fs = os.listdir(root);
# 得到绝对路径
fs = [os.path.join(root, x) for x in fs];
# print(fs)
infos = {}; # 存储每个学生的观看信息,结构为'张三':['3小时24分' ,'2小时13分', ...]
# 依次读取文件
for f in fs:
df = pd.read_excel(f); # 得到dataframe
# 获取第一列的数据 ,主要就是人名
col_names = list(df.iloc[:, 0]); # 外部要套list
# 遍历学生,找到每个学生出现在第几行;根据行号,对应的第二列就是观看信息
for name in names:
# 判断名字,也判断昵称
if name in col_names or (name in rename and rename[name] in col_names):
if name in col_names:
index = col_names.index(name); # 按名字找索引
else:
index = col_names.index(rename[name]) # 按照昵称找索引
time = df.iloc[index, 1]; # 得到观看时长
# 放入dict中
if name in infos:
infos[name].append(time);
else:
infos[name] = [time];
# print(infos); # OK,得到数据
# print(infos['aaa'])
# 统计列表总时长(分钟)
def getTotalTime(ts):
tt = [];
for t in ts:
if '时' in t or '分' in t or ':' in t:
t = t.replace('小', '').replace('钟', ''); # 将多余的描述去掉
# 将冒号替换为"时"和"分"
t = t.replace(":", '时', 1).replace(":", '分', 1);
tt.append(t);
# print(tt)
# 继续对tt处理
hs = 0; # 总小时数
ms = 0; # 总分钟数
for t in tt:
# 先找小时 '1时37分'
h = 0;
if '时' in t:
h = t[:t.index('时')]; # '1'
t = t[t.index('时') + 1:]; # '37分'
m = 0;
if '分' in t:
m = t[:t.index('分')]; # '37'
hs = hs + int(h);
ms = ms + int(m);
return hs * 60 + ms;
# print(getTotalTime(infos['aaa']));
tj = {};
for name, ts in infos.items(): # 字典遍历
tj[name] = getTotalTime(ts);
print(tj)
# 排序
ls = list(tj.items());
ls.sort(key=lambda x: x[1], reverse=True)
print(ls)