使用pandas .dt.round时报AttributeError:仅可对类日期时间值使用.dt访问器
问题描述
在将时间戳按30分钟步长取整时,触发错误:AttributeError: Can only use .dt accessor with datetimelike values。同一格式的另一个数据帧处理正常,当前代码及处理后的DataFrame如下:
运行代码
for hobo in loggers_hobo: df = pd.read_csv(path_input+hobo+ext, skiprows=[0]) df.rename(columns={'Date Time, GMT+01:00': 'TIMESTAMP', 'Abs Pres, psi (LGR S/N: '+hobo+', SEN S/N: '+hobo+')': 'Pressure_TOT_'+hobo, 'Temp, °F (LGR S/N: '+hobo+', SEN S/N: '+hobo+')': 'Temperature'}, inplace=True) df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP']).dt.strftime('%Y-%m-%d %H:%M:%S') df['TIMESTAMP'] = df['TIMESTAMP'].dt.round('30min') df.drop(['#', 'Coupler Detached (LGR S/N: '+hobo+')', 'Coupler Attached (LGR S/N: '+hobo+')', 'Host Connected (LGR S/N: '+hobo+')', 'End Of File (LGR S/N: '+hobo+')'], inplace=True, axis=1) df.to_csv(path_temp+hobo+ext) print(df)
处理后的DataFrame片段
TIMESTAMP Pressure_TOT_20796630 Temperature 0 2022-03-11 14:10:00 14.8332 75.659 1 2022-03-11 14:10:22 NaN NaN 2 2022-03-11 14:18:58 NaN NaN 3 2022-03-11 14:19:54 NaN NaN 4 2022-03-11 14:20:58 NaN NaN ... ... ... 16094 2023-02-09 12:40:00 16.5452 42.363 16095 2023-02-09 13:10:00 16.5363 42.179 16096 2023-02-09 13:20:36 NaN NaN 16097 2023-02-09 13:20:43 NaN NaN 16098 2023-02-09 13:20:58 NaN NaN
解决思路
错误原因:
pd.to_datetime()将字符串转为datetime类型后,立刻用dt.strftime()把它转回了字符串格式。字符串类型没有dt访问器,所以后续调用dt.round()会报错。另一个数据帧能正常处理,大概率是因为它没有执行dt.strftime()这一步,或者后续没有对字符串类型的时间戳调用dt方法。修正方案:
- 先完成时间取整操作,再转成字符串格式(如果业务需要显式的字符串格式):
# 先转为datetime类型并完成取整 df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP']).dt.round('30min') # 按需转成指定字符串格式 df['TIMESTAMP'] = df['TIMESTAMP'].dt.strftime('%Y-%m-%d %H:%M:%S') - 如果不需要显式的字符串格式,可以直接保留datetime类型处理,pandas在保存CSV时会自动将datetime类型转为标准字符串格式,不影响后续使用:
df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP']).dt.round('30min')
- 先完成时间取整操作,再转成字符串格式(如果业务需要显式的字符串格式):
替换原代码中错误的两行即可解决问题。
内容的提问来源于stack exchange,提问作者Tobias Bowley
相关产品推荐
相关产品推荐

