首页 > 其他分享 >Excel处理:统计打卡时长

Excel处理:统计打卡时长

时间:2024-04-16 17:25:19浏览次数:20  
标签:sheet df Excel column str time 打卡 minutes 统计

##Code Description: Statistics of attendance records(基于从打卡机导出的Excel表格,统计每个人每天的打卡时长,以及总打卡时长,将结果放入一个新的Excel表中)
##Author: RuichaoMao
##Date: 4-16-2024

import pandas as pd
from openpyxl import load_workbook

# 读取aaa.xlsx文件中的所有sheet
xls = pd.ExcelFile('attendance.xls')
sheet_names = xls.sheet_names

# 将处理后的所有sheet写入新的Excel文件
writer = pd.ExcelWriter('output.xlsx', engine='openpyxl')

# 遍历每个sheet进行处理
for sheet_name in sheet_names:
    # 读取sheet数据
    df = pd.read_excel(xls, sheet_name)

    # 对于前两个sheet不做任何操作
    if sheet_name in sheet_names[:2]:
    # 写入到新的Excel文件中
        df.to_excel(writer, sheet_name=sheet_name, index=False)
    
    # 对于后面的sheet进行处理
    #if sheet_name != sheet_names[0] and sheet_name != sheet_names[1]:
    #if sheet_name == sheet_names[5]:
    else:
        for column in [1,16,31]:
            for row in range(11,25):
                #column = 16
                # 提取时间字符串
                start_time_str = str(df.iloc[row, column])
                end_time_str = str(df.iloc[row, column+2])
                print (df.iloc[row, 1], df.iloc[row, column+2])
                # 根据时间字符串的长度判断时间格式
                print (len(start_time_str),len(end_time_str))
                if len(start_time_str) == 5:
                    pass
                elif len(start_time_str) == 8:  # 格式为小时:分钟:秒
                    # 去掉秒,重新构造时间字符串
                    start_time_str = start_time_str[:5]
                else:
                    pass
                    #raise ValueError("Unsupported time format")
                if len(end_time_str) == 5:
                    pass
                elif len(end_time_str) == 8:  # 格式为小时:分钟:秒
                    # 去掉秒,重新构造时间字符串
                    end_time_str = end_time_str[:5]
                else:
                    pass
                    #raise ValueError("Unsupported time format")
                if len(end_time_str) == 5 and len(end_time_str) == 5:
                    # 将时间字符串转换为 datetime 对象
                    start_time = pd.to_datetime(start_time_str, format='%H:%M')
                    end_time = pd.to_datetime(end_time_str, format='%H:%M')
                    print (start_time, end_time)
                    
                    # 计算时间差并转换成小时和分钟
                    time_diff = end_time - start_time
                    hours = int(time_diff.seconds // 3600)
                    minutes = int((time_diff.seconds % 3600) // 60)
                    
                    # 将结果放入第12行第13列
                    df.iloc[row, column+11] = f"{hours}小时{minutes}分钟"
                    print (df.iloc[row, column+11])
                else:
                    df.iloc[row, column+11] = f"无法计算"
                    print (df.iloc[row, column+11])
            #total time
            times = df.iloc[11:26,column+11].tolist()
            print (times)
            #df.iloc[10, column+11] = f"Total:"

            # 初始化总分钟数
            total_minutes = 0

            # 遍历每个时间并将其转换为分钟并相加
            for time_str in times:
                if isinstance(time_str, str):
                    if '小时' in time_str and '分钟' in time_str:
                        print (time_str)
                        #hours, minutes = map(int, time_str.split('小时')[0:2])
                        hours = int(time_str.split('小时')[0])
                        minutes = int(time_str.split('小时')[1].split('分钟')[0])
                        total_minutes += hours * 60 + minutes
                    #elif '小时' in time_str:
                        #hours = int(time_str.split('小时')[0])
                        #total_minutes += hours * 60
                    #elif '分钟' in time_str:
                        #minutes = int(time_str.split('分钟')[0])
                        #total_minutes += minutes

            # 将总分钟数转换为小时和分钟
            hours = total_minutes // 60
            minutes = total_minutes % 60
            df.iloc[10, column+11] = f"Total:{hours}小时{minutes}分钟"

            # 写入到新的Excel文件中
            df.to_excel(writer, sheet_name=sheet_name, index=False)


book = writer.book
book.save('output.xlsx')
# 保存并关闭新的Excel文件
writer.close()

标签:sheet,df,Excel,column,str,time,打卡,minutes,统计
From: https://www.cnblogs.com/jszd/p/18138723

相关文章

  • Excel提取数字公式
    =LEFT(TEXTJOIN("",TRUE,FILTER(MID(C31,SEQUENCE(LEN(C31)),1),ISNUMBER(VALUE(MID(C31,SEQUENCE(LEN(C31)),1))))),3)假设你要从单元格A1中提取连续数字,你可以使用以下公式:excelCopyCode=TEXTJOIN("",TRUE,FILTER(MID(A1,ROW(INDIRECT("1:"&LEN......
  • Python Flask+Pandas读取excel显示到html网页: CSS控制表格样式
    前言全局说明CSS控制表格样式一、安装flask模块二、引用模块三、启动服务模块安装、引用模块、启动Web服务方法,参考下面链接文章:https://www.cnblogs.com/wutou/p/17963563修改内容后,要重启flask服务,修改才能生效四、CSS控制表格样式4.1.2文件名:index.pyfrom......
  • Python Flask+Pandas读取excel显示到html网页:CSS控制表格样式
    前言全局说明一、安装flask模块二、引用模块三、启动服务模块安装、引用模块、启动Web服务方法,参考下面链接文章:https://www.cnblogs.com/wutou/p/17963563四、CSS控制表格样式4.1.2文件名:index.pyfromflaskimportFlaskapp=Flask(__name__)@app.route("/excel......
  • Python Flask+Pandas读取excel显示到html网页: 没有excle文件提示
    前言全局说明一、安装flask模块二、引用模块三、启动服务模块安装、引用模块、启动Web服务方法,参考下面链接文章:https://www.cnblogs.com/wutou/p/17963563四、没有excle文件提示4.1.2文件名:index.py添加tryexcept获取没有文件的异常fromflaskimportFlaskapp......
  • Python Flask+Pandas读取excel显示到html网页: 环境搭建显示内容
    前言全局说明一、安装flask模块二、引用模块三、启动服务模块安装、引用模块、启动Web服务方法,参考下面链接文章:https://www.cnblogs.com/wutou/p/17963563Pandas安装https://www.cnblogs.com/wutou/p/17811839.html四、环境搭建4.1.2文件名:index.pyfromflaskimp......
  • 2320. 统计放置房子的方式数
    题目链接:本题和198.打家劫舍有异曲同工之妙。由于街道两侧互不干扰,因此可以考虑只计算出一侧的状态,然后利用乘法原理即可。状态划分时,考虑第\(i\)个地块选或不选:若选,则第\(i-1\)个地块不能选,第\(i-2\)个地块可选可不选。\(f[i]=f[i-2]\)若不选,则第\(i-1\)个地块可......
  • Excel切片器
    Excel切片器是一个可以对超级表或数据透视表进行快速筛选的功能。使用切片器的步骤如下选中表格,按下Ctrl+T,将表格转换为超级表,或者创建数据透视表。点击设计选项卡,选择插入切片器,勾选需要筛选的字段,确定。在切片器界面,点击筛选按钮,可以单选或多选,按住Ctrl键可以多选。可以修......
  • Java进行excel的导入导出操作
    excel表格的导出导入在业务中经常会遇到,下面介绍hutool和easyExcel两种操作excel的工具测试的实体类通过mybatis-plus生成的,用于导出数据的实体类@Getter@Setter@TableName("device_info")@ApiModel(value="DeviceInfo对象",description="")publicclassDeviceInfo......
  • BZOJ 4403序列统计
    BZOJ4403序列统计解析序列满足单调不降序列,所以每个数可以选多次,我们可以把不同位置的同一个数看成多个,这样把区间为\([L,R]\)中的每一个数加上\(i\),得到的区间大小为\([L+1,R+n]\),也就是从\(R-L+n\)个数中选\(n\)个。\[\begin{aligned}&{\sum^n_{i=1}C^{i......
  • 2466. 统计构造好字符串的方案数
    题目链接:本题其实是爬楼梯这道题的变式。题目要求长度在\(\rmlow\simhigh\)之间的好字符串个数,那我直接把所有长度的好字符串个数搞出来,再取长度在这个区间的相加就完事了。设\(f[i]\)表示构造长为\(i\)的字符串的方案数,也即长为\(i\)的好字符串的个数。看最后一步......