You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Timestamp为Pandas DataFrame添加工作日及工作时段列?

解决方法:为DataFrame新增工作日和工作时段判断列

首先,咱们先梳理下你代码里的几个问题,然后给出高效的解决方案:

你代码里的核心错误

  1. 时间格式语法错误:09:00:00不是Python的合法字面量,不能直接用来比较;而且Python里的逻辑与是and,不是&&
  2. 列表判断逻辑错误:df['day_of_week']==days这种写法没法正确判断星期几是否在工作日列表里,得用isin()方法
  3. 变量名不一致:函数里一会儿用val一会儿用value,还有未定义的Time变量
  4. 低效的逐行处理:用自定义函数+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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:59:24