如何基于时间列给数据集添加First Shift等班次标签?现有方法无效求助
解决方案:基于时间区间匹配班次
问题分析
你之前的代码存在两个核心问题:
- 仅用整数小时划分区间,未处理时分秒级别的精确时间(比如7:00:00和17:00:01的临界值);
- 未覆盖跨天的时间区间(17:00:01至次日4:00:00),且区间划分逻辑与需求不符(比如把7:00:00错误归为Dead Time)。
正确实现步骤
要准确匹配班次,需先将Date和Time合并为完整的datetime对象,再通过精确的时间区间判断班次。
1. 数据准备与datetime合并
假设你的数据集已加载为df,首先合并日期和时间列:
import pandas as pd import numpy as np # 加载数据(示例) data = { 'Date': ['2022-04-13', '2022-09-07', '2022-04-13', '2022-04-14'], 'Time': ['16:57:00', '10:46:00', '03:30:00', '05:00:00'] } df = pd.DataFrame(data) # 合并Date和Time为datetime列 df['Datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time'])
2. 基于时间区间匹配班次
使用np.select按需求定义条件和对应班次:
# 定义时间区间条件 conditions = [ # First Shift: 当日7:00:00 至 17:00:00 (df['Datetime'].dt.time >= pd.to_datetime('07:00:00').time()) & (df['Datetime'].dt.time <= pd.to_datetime('17:00:00').time()), # Dead Time: 当日4:00:01 至 6:59:59 (df['Datetime'].dt.time >= pd.to_datetime('04:00:01').time()) & (df['Datetime'].dt.time <= pd.to_datetime('06:59:59').time()), # Second Shift: 17:00:01至当日23:59:59,或次日00:00:00至4:00:00 (df['Datetime'].dt.time >= pd.to_datetime('17:00:01').time()) | (df['Datetime'].dt.time <= pd.to_datetime('04:00:00').time()) ] # 对应班次名称 choices = ['First Shift', 'Dead Time', 'Second Shift'] # 生成班次列 df['Shifts'] = np.select(conditions, choices, default='Unknown')
3. 结果验证
运行后你的样例数据会得到如下结果:
| Date | Time | Datetime | Shifts |
|---|---|---|---|
| 2022-04-13 | 16:57:00 | 2022-04-13 16:57:00 | First Shift |
| 2022-09-07 | 10:46:00 | 2022-09-07 10:46:00 | First Shift |
| 2022-04-13 | 03:30:00 | 2022-04-13 03:30:00 | Second Shift |
| 2022-04-14 | 05:00:00 | 2022-04-14 05:00:00 | Dead Time |
内容的提问来源于stack exchange,提问作者Isha Panjwani
相关产品推荐
相关产品推荐

