如何基于Timestamp为Pandas DataFrame添加工作日及工作时段列?
解决方法:为DataFrame新增工作日和工作时段判断列
首先,咱们先梳理下你代码里的几个问题,然后给出高效的解决方案:
你代码里的核心错误
- 时间格式语法错误:
09:00:00不是Python的合法字面量,不能直接用来比较;而且Python里的逻辑与是and,不是&& - 列表判断逻辑错误:
df['day_of_week']==days这种写法没法正确判断星期几是否在工作日列表里,得用isin()方法 - 变量名不一致:函数里一会儿用
val一会儿用value,还有未定义的Time变量 - 低效的逐行处理:用自定义函数+
apply的方式不如直接用pandas的向量化操作高效
正确的实现步骤
我们可以利用pandas的dt属性直接对Timestamp列进行时间提取和判断,不需要写循环或自定义函数:
1. 准备数据并转换Timestamp类型
首先确保你的Timestamp列是datetime类型(如果还不是的话):
import pandas as pd # 构造你的数据 data = { 'UID': ['AAD', 'AAD', 'SAP', 'SAP', 'YAS'], 'Timestamp': ['2017-07-11 09:31:44', '2017-07-11 23:24:43', '2017-07-23 14:24:34', '2017-07-24 16:58:49', '2017-07-31 21:10:35'], 'Day_of_week': ['Thursday', 'Thursday', 'Saturday', 'Wednesday', 'Monday'] } df = pd.DataFrame(data) # 转换Timestamp列为datetime类型 df['Timestamp'] = pd.to_datetime(df['Timestamp'])
2. 新增Weekday列(判断是否为工作日)
用isin()方法判断星期几是否在周一到周五的列表里:
workdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] df['Weekday'] = df['Day_of_week'].isin(workdays)
3. 新增Weekday_bussi_hour列(判断是否在工作日的工作时段内)
我们可以两种方式判断时间是否在9:00-18:00之间:
方法一:直接比较时间对象
# 定义工作时段的开始和结束时间 start_time = pd.to_datetime('09:00:00').time() end_time = pd.to_datetime('18:00:00').time() # 同时满足:是工作日,且时间在[09:00, 18:00)范围内 df['Weekday_bussi_hour'] = df['Weekday'] & (df['Timestamp'].dt.time >= start_time) & (df['Timestamp'].dt.time < end_time)
方法二:通过小时判断(更简洁)
如果你的场景不需要精确到分钟/秒,只看小时的话:
df['Weekday_bussi_hour'] = df['Weekday'] & (df['Timestamp'].dt.hour >= 9) & (df['Timestamp'].dt.hour < 18)
最终输出结果
运行完上述代码后,你的DataFrame就会变成你期望的样子:
UID Timestamp Day_of_week Weekday Weekday_bussi_hour 0 AAD 2017-07-11 09:31:44 Thursday True True 1 AAD 2017-07-11 23:24:43 Thursday True False 2 SAP 2017-07-23 14:24:34 Saturday False False 3 SAP 2017-07-24 16:58:49 Wednesday True True 4 YAS 2017-07-31 21:10:35 Monday True False
补充说明
- 如果你的工作时段需要包含18:00整,只需要把判断条件改成
<= end_time或者<=18即可 - 向量化操作比逐行
apply的效率高很多,尤其是当你的DataFrame数据量很大的时候
内容的提问来源于stack exchange,提问作者ARJ
相关产品推荐
相关产品推荐

