如何按日期、摄影师条件计算分钟级时间差(支持Excel/Python/SQL)
时长计算实现方案
所有方案都需要先将整个表格按【Date升序 → Photographer升序 → Time升序】排序,保证同个摄影师同天的记录按时间先后排列,计算结果才准确
方案1:Excel公式实现
假设表头在第1行,数据从第2行开始,TimeWorked为D列:
- 第2行的D2单元格直接填
0(分组首行固定为0) - 第3行的D3单元格输入公式:
=IF(OR(A3<>A2,C3<>C2),0,ROUND((B3-B2)*1440,0))
公式说明:判断当前行与上一行的日期、摄影师是否完全一致,只要有一个字段变化就返回0,否则将时间差乘以1440(天转分钟的换算系数)得到分钟级时长,比MINUTE函数兼容性更高,不会出现小时部分被忽略的问题。
- 选中D3单元格下拉填充到所有行即可,1.3万行几秒就能完成计算。
方案2:Python实现(适合批量处理,容错率更高)
- 先安装依赖库:
pip install pandas - 执行如下代码,按注释修改文件路径即可:
import pandas as pd # 读取原始文件,Excel格式替换为pd.read_excel("原始文件路径.xlsx") df = pd.read_csv("你的原始文件路径.csv") # 合并日期时间为完整时间戳,若你的日期格式为月/日/年,将format改为'%m/%d/%Y %I:%M:%S %p' df["datetime"] = pd.to_datetime(df["Date"] + " " + df["Time"], format="%d/%m/%Y %I:%M:%S %p") # 按摄影师+日期分组计算相邻行时间差,首行空值填充为0 df["TimeWorked"] = df.groupby(["Photographer", "Date"])["datetime"].diff().dt.total_seconds().div(60).fillna(0).round(0).astype(int) # 导出结果,不会覆盖原始文件 df.to_csv("计算完成结果.csv", index=False, encoding="utf-8-sig")
方案3:SQL实现(数据存储在数据库时使用)
假设表名为photographer_work_log,SQL语句如下:
SELECT Date, Time, Photographer, CASE WHEN LAG(CONCAT(Date, ' ', Time)) OVER (PARTITION BY Photographer, Date ORDER BY STR_TO_DATE(CONCAT(Date, ' ', Time), '%d/%m/%Y %r')) IS NULL THEN 0 ELSE TIMESTAMPDIFF( MINUTE, LAG(STR_TO_DATE(CONCAT(Date, ' ', Time), '%d/%m/%Y %r')) OVER (PARTITION BY Photographer, Date ORDER BY STR_TO_DATE(CONCAT(Date, ' ', Time), '%d/%m/%Y %r')), STR_TO_DATE(CONCAT(Date, ' ', Time), '%d/%m/%Y %r') ) END AS TimeWorked FROM photographer_work_log ORDER BY STR_TO_DATE(Date, '%d/%m/%Y'), Photographer, STR_TO_DATE(Time, '%r');
内容的提问来源于stack exchange,提问作者Dhiraj D
相关产品推荐
相关产品推荐

