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

使用Pandas将CSV年月日列转为Datetime索引报错求助

问题分析与解决方法

常见报错原因

1. 存在无效日期值

你的CSV数据中可能包含不符合日历规则的数值,比如月份>12、日期>当月最大天数(比如2月30日)、或年份/月份/日期为0的无效值,pd.to_datetime默认采用严格模式,遇到这类值会直接抛出ValueError。

2. 两位数年份的解析冲突

如果你的年份是两位数(比如示例中的61),pandas默认解析规则为:00-68对应2000-2068,69-99对应1969-1999。若你的数据年份实际是19xx(比如61代表1961),当数据中存在00-68的年份时,可能因解析出的日期不符合预期间接引发错误。

3. 列名不匹配

确认你的DataFrame中确实存在Yr、Mo、Dy三列,若CSV实际列名是Year/Month/Day这类拼写,会导致data[['Yr','Mo','Dy']]取到空数据,触发解析错误。


解决步骤

第一步:定位无效数据

先将解析模式改为errors='coerce',把无效日期转为NaT(Not a Time),从而找到问题行:

data['Date'] = pd.to_datetime(data[['Yr', 'Mo', 'Dy']], errors='coerce')
# 打印解析失败的行
print(data[data['Date'].isna()])

根据输出的无效行,修正CSV中的错误数据(比如把13月改成12月,32日改成31日等)。

第二步:处理两位数年份(若需要)

如果你的年份都是19xx的两位数,手动给年份加1900后再解析:

# 给两位数年份加上1900,转为四位数
data['Yr'] = data['Yr'] + 1900
# 重新生成datetime列
data['Date'] = pd.to_datetime(data[['Yr', 'Mo', 'Dy']])

或者用format参数明确指定日期格式,强制按两位数年份解析:

# 按"年-月-日"的字符串格式拼接后解析
data['Date'] = pd.to_datetime(
    data['Yr'].astype(str) + '-' + data['Mo'].astype(str) + '-' + data['Dy'].astype(str),
    format='%y-%m-%d'
)

第三步:设置索引并删除原列

确认解析成功后,再执行后续操作:

data.set_index('Date', inplace=True)
data.drop(['Yr', 'Mo', 'Dy'], axis=1, inplace=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:08:16