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
相关产品推荐
相关产品推荐

