使用Pandas DateTime Apply方法报错:'Timestamp'对象无'dt'属性
解决
apply中调用dt.second触发的AttributeError问题 问题根源
你碰到的AttributeError: 'Timestamp' object has no attribute 'dt'其实很好理解:
- 当你执行
data['TS'].dt.second时,data['TS']是一个pandas Series对象,dt是pandas为datetime类型序列专门提供的访问器,用来批量处理序列里的所有datetime元素。 - 但使用
apply()方法时,传入myTimeFun的tsRow是单个的Timestamp对象(也就是Series里的每一行独立元素),单个Timestamp本身就自带second属性,完全不需要通过dt访问器来调用。
修正后的代码
只需要把函数里的tsRow.dt.second改成直接访问tsRow.second即可:
from datetime import timedelta def myTimeFun(tsRow): addSec = 0 # 可替换为你需要的数值 thisSec = tsRow.second # 直接调用Timestamp的second属性 return tsRow + timedelta(seconds=addSec) data['TS_Apx30Sec'] = data['TS'].apply(myTimeFun)
更高效的替代方案(推荐)
其实完全没必要用apply——pandas支持矢量化操作,效率比逐行遍历的apply高得多,尤其是数据量较大时:
addSec = 0 data['TS_Apx30Sec'] = data['TS'] + timedelta(seconds=addSec) # 如果需要根据秒数动态计算addSec,也可以用矢量化方式实现,比如: # data['addSec'] = 30 - data['TS'].dt.second % 30 # data['TS_Apx30Sec'] = data['TS'] + pd.to_timedelta(data['addSec'], unit='s')
这种方式既规避了属性错误,又能充分利用pandas的性能优势。
内容的提问来源于stack exchange,提问作者user2458922
相关产品推荐
相关产品推荐

