pandas读Excel时时间列常为字符串,需用pd.to_datetime()转换;分组取最早/最晚打卡应先排序再取iloc[0]/iloc[-1];加班计算须扣除午休且区分工作日/节假日;写回Excel用openpyxl保留格式。

用 pandas 读取打卡 Excel 表格时,时间列常被识别为字符串
很多考勤系统导出的 Excel 文件里,打卡时间看起来像 "09:00:23" 或 "2024/03/15 08:59",但 pandas.read_excel() 默认不会自动转成 datetime 类型。直接算时长会报错或结果为 NaT。
- 先检查列类型:
df['打卡时间'].dtype,如果是object,大概率是字符串 - 用
pd.to_datetime(df['打卡时间'], errors='coerce')强制转换,errors='coerce'能把无法解析的值转为NaT,避免中断 - 如果时间分散在两列(如“日期”+“时间”),合并后再转:
pd.to_datetime(df['日期'].astype(str) + ' ' + df['时间'].astype(str))
按员工和日期分组后,怎么取最早打卡和最晚打卡?
不能直接用 min() 和 max() 对原始时间列暴力聚合——万一某人当天有 5 次打卡(比如中间外出又返岗),min/max 会误判为上下班时间。得先过滤、再取值。
- 按
['员工姓名', '日期']分组后,对每组时间列排序:group.sort_values('打卡时间') - 取第一行当上班时间:
group.iloc[0]['打卡时间'],最后一行当下班时间:group.iloc[-1]['打卡时间'] - 更稳妥的做法是限定打卡类型(如有“上班打卡”“下班打卡”标记列),优先匹配标记,再 fallback 到极值
计算加班时长要避开午休、且需区分工作日/节假日
硬编码“18:00 后算加班”会出问题:有人 17:30 下班,有人 20:00 加班,但中间可能有 1.5 小时午休,直接用下班减上班会虚高。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 定义标准工作时段,例如工作日为
'09:00'–'18:00',午休'12:00'–'13:30';节假日则按公司排班表或国家法定假日列表判断 - 用
datetime.time提取时间部分做逻辑判断,别用字符串比较('9:30' > '18:00'会错) - 加班 = max(0, 实际下班时间 − 标准下班时间) − 午休重叠部分,建议封装成函数,传入单条记录的上下班时间、日期、是否节假日
openpyxl 写回 Excel 时,原有格式(如边框、颜色)会丢失
很多人想把统计结果(如每人每日加班小时数)写回原表的新增列,但 pandas.DataFrame.to_excel() 默认不保留格式,openpyxl 可以,但操作稍复杂。
- 用
openpyxl.load_workbook()打开原文件,获取worksheet - 不要用
df.to_excel()覆盖整个 sheet;而是遍历结果数据,用ws.cell(row=..., column=...).value = ...写入指定列 - 写完记得调用
wb.save(),否则无效果;且该操作不能在文件被 Excel 程序打开时进行(会 PermissionError)
实际跑通的关键在于:时间字段清洗必须放在第一步,且所有时间运算都基于 datetime64[ns];分组聚合前确认是否已按时间排序;节假日判断别依赖人工维护的字典,最好对接企业 OA 的 API 或用 chinese_calendar 库。这些点漏掉一个,加班时长就容易多算或少算一两个小时。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










