如何将考勤时间戳导入Pandas DataFrame并计算员工总工时
用Pandas计算员工总工时
步骤1:导入数据并处理重复列名
CSV中重复的In/Out列,Pandas会自动添加后缀(如In.1、Out.1),先读取数据:
import pandas as pd # 读取考勤CSV文件,指定第一行为列名 df = pd.read_csv('考勤数据.csv', header=0)
步骤2:分离In/Out列
自动筛选所有In开头和Out开头的列,适配任意数量的考勤列:
in_cols = [col for col in df.columns if col.startswith('In')] out_cols = [col for col in df.columns if col.startswith('Out')]
步骤3:转换时间字符串为datetime类型
处理带a.m./p.m.的时间格式,同时自动忽略格式错误的无效值:
# 转换In列时间,适配MM/DD/YYYY 12小时制格式 df[in_cols] = df[in_cols].apply(pd.to_datetime, format='%m/%d/%Y %I:%M:%S %p', errors='coerce') # 转换Out列时间,errors='coerce'将错误格式转为NaT(无效时间) df[out_cols] = df[out_cols].apply(pd.to_datetime, format='%m/%d/%Y %I:%M:%S %p', errors='coerce')
步骤4:计算每位员工总工时
对每行所有Out时间求和,减去所有In时间的和,最终转换为小时数:
# 计算总工时:Out时间总和 - In时间总和,转成小时 df['总工时(小时)'] = (df[out_cols].sum(axis=1) - df[in_cols].sum(axis=1)).dt.total_seconds() / 3600 # 输出结果 print(df[['姓名', '总工时(小时)']])
补充说明
- 若需要保留原始时间差格式(如
2 days 4 hours),可去掉.dt.total_seconds() / 3600,直接保留差值结果 - 该方法自动适配任意数量的
In/Out列,处理数百列数据也能保持高效
内容的提问来源于stack exchange,提问作者Clare
相关产品推荐
相关产品推荐

