pandas按月份筛选行时.dt访问器报错但字段为datetime类型如何解决?
问题原因
- 单个
datum字段值虽然是datetime.datetime类型,但整列Series的dtype为object类型,pandas的.dt访问器仅支持datetime64系列类型的Series,不支持object类型的Series,哪怕列内所有元素都是原生datetime对象也会触发该报错。 - 你之前使用
apply(pd.to_datetime)逐行转换没有报错,但因为列内datetime对象携带了psycopg2的自定义FixedOffsetTimezone时区对象,逐行转换后的结果无法被pandas自动合并为统一的带时区datetime64类型列,最终还是保留为object dtype,因此还是无法使用.dt访问器。
解决方法
临时解决方案
不需要修改列类型,直接通过map方法调用每个原生datetime对象的month属性即可完成筛选:
df.loc[df['datum'].map(lambda x: x.month) <= 6]
永久解决方案(支持正常使用.dt访问器)
不要使用逐行apply转换,直接对整列调用pd.to_datetime,pandas会自动识别带时区的datetime对象,将整列转换为对应带时区的datetime64[ns, tz]类型:
# 整列转换为pandas标准datetime类型 df['datum'] = pd.to_datetime(df['datum']) # 转换完成后即可正常使用.dt访问器 df.loc[df['datum'].dt.month <= 6]
如果业务中不需要时区信息,转换后可统一去除时区:
# 转换为无时区的datetime64类型 df['datum'] = pd.to_datetime(df['datum']).dt.tz_convert(None)
内容的提问来源于stack exchange,提问作者Bera
相关产品推荐
相关产品推荐

