
当 pandas 的 to_datetime() 遇到仅有年份(如 "1922")却默认按 %Y-%m-%d 解析时,会抛出格式不匹配错误;解决方法是显式指定 format='%Y' 或使用 infer_datetime_format=True 等策略。
当 pandas 的 `to_datetime()` 遇到仅有年份(如 `"1922"`)却默认按 `%y-%m-%d` 解析时,会抛出格式不匹配错误;解决方法是显式指定 `format='%y'` 或使用 `infer_datetime_format=true` 等策略。
在使用 pd.to_datetime() 将字符串列转为 datetime 类型时,pandas 默认尝试按 ISO 标准(如 "2023-01-01")解析。但若你的 release_date 列实际只包含年份(例如 "1922"、"1998"),pandas 会因无法匹配默认期望的 "YYYY-MM-DD" 格式而报错:
ValueError: time data "1922" doesn't match format "%Y-%m-%d", at position 3
✅ 正确做法是明确告知 pandas 输入数据的实际格式。对于纯年份字符串,应使用 format='%Y':
df_tracks.set_index('release_date', inplace=True)
df_tracks.index = pd.to_datetime(df_tracks.index, format='%Y') # ✅ 指定年份格式
df_tracks.head()
执行后,"1922" 将被转换为 Timestamp('1922-01-01 00:00:00') —— 即自动补全为当年 1 月 1 日。
? 其他实用选项(按场景推荐):
- 若数据格式混杂(如部分为 "1999",部分为 "2020-05",还有 "2021-03-15"),改用 format='mixed'(需 pandas ≥ 2.0):
df_tracks.index = pd.to_datetime(df_tracks.index, format='mixed')
- 若不确定格式但希望自动推断(性能略优),可加 infer_datetime_format=True:
df_tracks.index = pd.to_datetime(df_tracks.index, infer_datetime_format=True)
- 若原始数据中存在无效值(如空字符串、None),建议添加 errors='coerce' 将其转为 NaT,避免中断:
df_tracks.index = pd.to_datetime(df_tracks.index, format='%Y', errors='coerce')
⚠️ 注意事项:
- format 参数必须与字符串严格一致(如 %Y 对应 4 位年份,%y 对应 2 位);
- 错误使用 format(如对 "1999-06" 传入 '%Y')仍会报错;
- 设置 inplace=True 后无需重新赋值,但 pd.to_datetime() 本身不支持 inplace,务必通过赋值更新索引。
掌握格式显式声明原则,即可稳健处理各类非标准日期字段。










