Python:每日一题 142:算出时间差(以秒计)

本文介绍了一个用Python编写的函数,该函数可以计算两个时间点之间的差值(以秒为单位)。特别地,如果结束时间早于开始时间,则假定结束时间在次日。文章通过一个具体例子展示了如何使用这个函数。
给出两个时间算出时间差(以秒计),如果结束时间小于开始时间则结束时间在下一天,开始和结束时间不超过1天。
例如:
start = 17:55:31
stop = 4:21:57

时间差为:37586s


Python源码:

def minus(start, end):
    _start = list(map(int, start.split(':')))
    _end = list(map(int, end.split(':')))
    if _start > _end:
        return minus(start, '24:0:0') + minus('0:0:0', end)
    result = _end[2] - _start[2] + 60 * (_end[1] - _start[1]) + 3600 * (_end[0] - _start[0])
    return result
start = input("start:")
stop = input("stop:")
print(minus(start, stop))

<think>嗯,用户想要用Python写一个基于Excel的员工考勤算工具,用来算工时和加班时间。首先,我需要明确用户的具体需求。考勤系统通常需要处理打卡时间,每日工时,判断是否有迟到早退,以及加班时间。可能需要考虑不同的加班类型,比如工作日加班、周末加班和节假日加班。 用户可能对Excel的操作比较熟悉,所以使用Python处理Excel文件是个好选择。常用的库有pandas和openpyxl。pandas处理数据方便,而openpyxl适合读写Excel文件。首先需要确定Excel的数据结构,比如员工姓名、日期、上下班时间等。 接下来,工时算。正常工作时间可能是8小时,超出部分算加班。需要处理跨天的情况吗?比如夜班。但用户可能暂时不需要那么复杂,先假设打卡时间在同一天。迟到和早退的判断需要公司规定,比如9点上班,晚于9点算迟到,早于18点下班算早退。 加班时间的算比较复杂。工作日加班可能是指下班时间超过18点后的时间,周末和节假日则是全天的工作时间视为加班。需要用户提供具体的规则,但这里可能需要假设或给出示例。 然后是Python代码的结构。首先读取Excel数据,处理时间格式,每日工时,汇总统。可能需要使用datetime模块处理时间。注意打卡时间可能有缺失或错误,需要异常处理。 步骤分解:1.读取Excel考勤数据;2.数据清洗,处理缺失;3.算每个员工的每日工作时间;4.判断迟到早退;5.算正常工时和加班工时;6.结果输出到新Excel文件。 可能遇到的问题:时间格式不一致,比如字符串转datetime对象;跨日处理;不同加班类型的区分。需要逐步测试每个部分,确保逻辑正确。 最后,给出一个示例代码框架,让用户可以根据实际需求调整参数和规则。提醒用户需要安装pandas和openpyxl库,并注意Excel中的时间格式是否正确。可能还需要处理多个打卡记录,比如上午和下午的打卡,需要确定如何配对上下班时间。</think>以下是一个基于Python的Excel员工考勤算工具实现方案,使用pandas和openpyxl库处理数据: ```python import pandas as pd from datetime import datetime, timedelta def calculate_attendance(excel_path): # 定义工作时间参数 WORKDAY_START = timedelta(hours=9) # 上午9点 WORKDAY_END = timedelta(hours=18) # 下午6点 DAILY_WORK_HOURS = 8 # 每日标准工时 WEEKLY_WORK_DAYS = 5 # 每周工作天数 # 读取Excel数据 df = pd.read_excel(excel_path, parse_dates=['日期', '上班时间', '下班时间']) # 每日工作时长 df['工作时长'] = (df['下班时间'] - df['上班时间']).dt.total_seconds() / 3600 # 判断迟到/早退 df['上班时间差'] = (df['上班时间'].dt.time.apply(lambda x: datetime.combine(datetime.min, x)) - datetime.min).dt.total_seconds()/3600 - 9 df['迟到'] = df['上班时间差'].apply(lambda x: max(0, x) if x > 0 else 0) df['下班时间差'] = (df['下班时间'].dt.time.apply(lambda x: datetime.combine(datetime.min, x)) - datetime.min).dt.total_seconds()/3600 - 18 df['早退'] = df['下班时间差'].apply(lambda x: max(0, -x) if x < 0 else 0) # 算加班时长 def calculate_overtime(row): weekday = row['日期'].weekday() work_hours = row['工作时长'] # 工作日加班 if weekday < 5: overtime = max(0, work_hours - DAILY_WORK_HOURS) return {'工作日加班': overtime, '周末加班': 0, '节假日加班': 0} # 周末加班 elif weekday == 5 or weekday == 6: return {'工作日加班': 0, '周末加班': work_hours, '节假日加班': 0} # 这里可以添加节假日判断逻辑 overtime_df = df.apply(calculate_overtime, axis=1, result_type='expand') df = pd.concat([df, overtime_df], axis=1) # 生成统报表 summary = df.groupby('姓名').agg({ '工作时长': 'sum', '迟到': 'sum', '早退': 'sum', '工作日加班': 'sum', '周末加班': 'sum' }).reset_index() # 保存结果 output_path = excel_path.replace('.xlsx', '_算结果.xlsx') with pd.ExcelWriter(output_path) as writer: df.to_excel(writer, sheet_name='原始数据', index=False) summary.to_excel(writer, sheet_name='统报表', index=False) return output_path # 使用示例 result_file = calculate_attendance('考勤记录.xlsx') print(f"算结果已保存至:{result_file}") ``` 需要准备的Excel数据结构示例: | 姓名 | 日期 | 上班时间 | 下班时间 | |------|------------|--------------------|--------------------| | 张三 | 2023-03-01 | 2023-03-01 09:00:00 | 2023-03-01 18:30:00 | | 李四 | 2023-03-01 | 2023-03-01 09:15:00 | 2023-03-01 19:00:00 | 实现功能: 1. 自动每日工作总时长 2. 统迟到/早退时间 3. 区分工作日加班/周末加班 4. 生成详细统报表 5. 自动保存算结果到新Excel文件 使用前需要安装依赖库: ```bash pip install pandas openpyxl ``` 注意事项: 1. 确保Excel中的时间列格式正确 2. 根据实际需求调整工作时间参数 3. 可扩展添加节假日判断逻辑 4. 建议在原始数据中添加员工ID等唯一标识 5. 可扩展支持午休时间扣除等功能 实际使用时,请根据企业具体考勤规则调整算逻辑,特别是加班时间的算标准和异常情况的处理规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值