Python实训day10pm【os模块-处理Excel统计学生观看直播时长】

学以致用,课堂练习:考勤目录中存放的是所有的考勤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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

upward337

谢谢老板~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值