如何用Pandas计算员工跨工作日班次间的休息时长
跨工作日休息时长计算方案
数据修正说明
原数据中Alice的2022-01-65 12:30:00为无效日期,需先修正为2022-01-16 12:30:00,否则无法进行日期相关计算。
实现步骤与代码
- 数据初始化与类型转换
先将原始数据转为DataFrame,并把shift_start和shift_end转换为datetime类型,同时提取日期字段用于后续按日分组。
import pandas as pd # 修正无效日期后的原始数据 data = { 'worker': ['Alice', 'Alice', 'Alice', 'Alice', 'Alice', 'Bob', 'Bob', 'Bob', 'Bob', 'Bob'], 'shift_start': ['2022-01-15 11:30:00', '2022-01-15 17:30:00', '2022-01-15 18:30:00', '2022-01-16 10:30:00', '2022-01-16 12:30:00', '2022-01-15 10:30:00', '2022-01-15 12:30:00', '2022-01-15 15:30:00', '2022-01-17 10:30:00', '2022-01-17 16:30:00'], 'shift_end': ['2022-01-15 15:30:00', '2022-01-15 18:29:59', '2022-01-15 20:30:00', '2022-01-16 11:29:59', '2022-01-16 15:30:00', '2022-01-15 12:29:59', '2022-01-15 14:30:00', '2022-01-15 18:30:00', '2022-01-17 15:30:00', '2022-01-17 18:30:00'], 'function': ['A', 'A', 'B', 'B', 'A', 'B', 'A', 'A', 'A', 'B'] } df = pd.DataFrame(data) # 转换为datetime类型 df['shift_start'] = pd.to_datetime(df['shift_start']) df['shift_end'] = pd.to_datetime(df['shift_end']) # 提取日期字段 df['date'] = df['shift_start'].dt.date
- 计算每日首尾班次时间
按员工和日期分组,统计每个员工每日的第一班开始时间和最后一班结束时间。
daily_summary = df.groupby(['worker', 'date']).agg( daily_first_start=('shift_start', 'min'), daily_last_end=('shift_end', 'max') ).reset_index()
- 计算跨日休息时长
对每个员工的每日数据按日期排序,用当日首班开始时间减去前一日末班结束时间,得到跨日休息时长,首次工作日的休息时长自动为NaN。
daily_summary['break_time'] = daily_summary.groupby('worker').apply( lambda x: x['daily_first_start'] - x['daily_last_end'].shift(1) ).reset_index(drop=True)
- 映射回原数据
将计算好的休息时长合并回原始DataFrame,确保同一工作日的所有班次都显示相同的休息时长。
df = df.merge(daily_summary[['worker', 'date', 'break_time']], on=['worker', 'date'], how='left') # 清理临时字段 df = df.drop('date', axis=1)
结果验证
运行后得到的结果中:
- Alice 2022-01-16的所有班次
break_time为0 days 14:00:00 - Bob 2022-01-17的所有班次
break_time为1 days 16:00:00
完全符合需求。
内容的提问来源于stack exchange,提问作者datadatadata
相关产品推荐
相关产品推荐

