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

