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
相关产品推荐
相关产品推荐

