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

pandas按月份筛选行时.dt访问器报错但字段为datetime类型如何解决?

问题原因

  1. 单个datum字段值虽然是datetime.datetime类型,但整列Series的dtype为object类型,pandas的.dt访问器仅支持datetime64系列类型的Series,不支持object类型的Series,哪怕列内所有元素都是原生datetime对象也会触发该报错。
  2. 你之前使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:45:01