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

Pandas 2.0修改date_created列后新增列报错求助

Pandas 2.0中修改datetime列后无法使用.dt访问器的问题分析与解决

问题重现

在Pandas 2.0版本中,执行以下代码时会抛出AttributeError: Can only use .dt accessor with datetimelike values异常,但在1.5.3版本中可正常运行:

import pandas as pd
from io import StringIO

data = """
date_created,value
2018-01-01 00:00:00,1
2018-02-01 00:00:00,2
2018-03-01 00:00:00,3
"""

df = pd.read_csv(StringIO(data))
# 尝试将列转换为datetime后提取年份
df.loc[:, 'date_created'] = pd.to_datetime(df.loc[:, 'date_created'], errors='raise')
df['year_created'] = df['date_created'].dt.year

而直接将年份赋值给date_created列的代码却能正常运行:

df.loc[:, 'date_created'] = pd.to_datetime(df.loc[:, 'date_created'], errors='raise').dt.year

问题原因

这是Pandas 2.0的行为变化导致的:当将datetime类型的值赋值给原本为object类型的列时,Pandas 2.0不会自动将列的 dtype 转换为datetime64[ns],而是保留object类型。此时df['date_created']表面是datetime值,但实际 dtype 仍为object,因此无法使用.dt访问器。而在1.5.3版本中,此类赋值操作会自动触发列类型的转换。

解决建议

针对这个问题,有以下几种可行的解决方式:

1. 显式转换列的dtype

在赋值后手动将列转换为datetime类型:

df.loc[:, 'date_created'] = pd.to_datetime(df.loc[:, 'date_created'], errors='raise')
# 显式指定列的datetime类型
df['date_created'] = df['date_created'].astype('datetime64[ns]')
df['year_created'] = df['date_created'].dt.year

2. 直接赋值列(跳过视图/副本歧义)

直接对列进行赋值操作,Pandas会自动处理类型转换:

df['date_created'] = pd.to_datetime(df['date_created'], errors='raise')
df['year_created'] = df['date_created'].dt.year

3. 读取CSV时直接解析日期列

在pd.read_csv中使用parse_dates参数,提前将date_created列解析为datetime类型,从根源避免类型问题:

df = pd.read_csv(StringIO(data), parse_dates=['date_created'])
df['year_created'] = df['date_created'].dt.year

补充说明

该问题并非个例,已有其他用户反馈类似的Pandas 2.0类型赋值行为变化。如果需要深入了解,可以查看Pandas 2.0官方文档中关于类型推断与赋值逻辑的更新说明。

内容的提问来源于stack exchange,提问作者user948055

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 22:37:31