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

Pandas时间列时段判断报错:Timestamp无dt属性及类型不兼容

解决Pandas中时间区间判断与日期调整问题

错误原因分析

  • 使用map+lambda时,单个Timestamp对象无法直接与datetime.time类型的值比较,类型不匹配导致TypeError;
  • dt是Pandas Series的专属属性,用于批量处理时间序列,单个Timestamp对象没有dt属性,因此调用x.dt.time会报错。

最优解决方案(向量化操作,高效适配大数据量)

针对10万行的数据集,优先使用Pandas的向量化操作,避免逐行处理的性能损耗:

方法1:通过小时数快速判断区间

如果只需判断小时在0-8点(不含8点整),直接提取小时数生成掩码:

import pandas as pd
from datetime import timedelta

# 假设你的数据集已存入df,「Time/Date」列已转为datetime类型
df['Date_adjusted'] = df['Time/Date'].copy()
# 生成时间区间掩码:00:00-08:00(不含08:00)
mask = df['Time/Date'].dt.hour.between(0, 7)
# 对符合条件的行调整日期
df.loc[mask, 'Date_adjusted'] = df.loc[mask, 'Time/Date'] - timedelta(days=1)

如果需要包含08:00整,将between(0,7)改为between(0,8)即可。

方法2:精确到时分秒的区间判断

如果需要严格匹配00:00:00到08:00:00的时间范围(含边界),可以提取时间部分进行比较:

import pandas as pd
from datetime import timedelta

# 定义时间边界
start_time = pd.Timestamp('00:00:00').time()
end_time = pd.Timestamp('08:00:00').time()

# 生成精确时间区间的掩码
mask = (df['Time/Date'].dt.time >= start_time) & (df['Time/Date'].dt.time <= end_time)

# 使用where方法批量调整日期:mask为False时保留原时间,True时减1天
df['Date_adjusted'] = df['Time/Date'].where(~mask, df['Time/Date'] - timedelta(days=1))

修正后的逐行处理方案(不推荐,效率低)

如果一定要用map+lambda,需针对单个Timestamp对象调用.time()方法获取时间部分,再与datetime.time类型的值比较:

import pandas as pd
from datetime import time, timedelta

df['Date_adjusted'] = df['Time/Date'].map(lambda x: x - timedelta(days=1) if (time(0,0) <= x.time() <= time(8,0)) else x)

注意:这种逐行处理方式在10万行数据上的运行效率远低于向量化操作,不建议使用。

内容的提问来源于stack exchange,提问作者mohamedhusaein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:27:37