You need to enable JavaScript to run this app. Pandas加载多CSV合并时间序列时自动转为年度频率的问题排查
优惠活动
大模型
产品
解决方案
定价
更多

Pandas加载多CSV合并时间序列时自动转为年度频率的问题排查

核心问题原因

所有合并后只剩年度行的异常,本质是不同DataFrame的索引类型不统一,触发了pandas合并时的隐式类型不兼容匹配逻辑,和频率自动转换没有任何关系:

  • 你加载s1时设置了parse_dates=True,所以ds1的索引是真正的datetime64日期类型;但s2、s3、s4加载时完全没加这个参数:
    • 哪怕s2的输出打印成1960-01-01的格式,它的索引本质还是字符串类型,只是恰好是ISO格式字符串
    • 你可以从ds3的输出直观看到问题:索引是01/02/1978格式的原生字符串,根本没被解析成日期对象
  • 当你用merge(left_index=True, right_index=True)合并不同索引类型的表时,pandas不会自动把字符串索引转成datetime,反而会把datetime索引转成字符串去做匹配:
    比如datetime类型的1978-02-01转成字符串是1978-02-01,和ds3里存的01/02/1978字符串完全不一致,匹配失败直接被丢弃;
    只有每年1月1日的datetime转成字符串后(比如1979-01-01),和ds3里格式恰好能对上的01/01/1979字符串能匹配上,最后合并结果就只剩每年1月的行,看起来像自动降成了年度频率。
修复步骤
  1. 给所有读取CSV的操作统一添加parse_dates=True参数,强制把索引列解析成真正的datetime64类型,不管原CSV里的日期是YYYY-MM-DD还是DD/MM/YYYY格式,pandas都会自动识别转换
    示例修正的s3读取代码:
    s3 = pd.read_csv(
        r"C:\Users\Tim Peterson\Documents\Tom\Rocky\LRHUTTTTAUM156S.csv",
        encoding="ISO-8859-1",
        engine='python',
        header=0,
        index_col=0,
        parse_dates=True
    )
    
  2. 把逐次调用merge的合并逻辑,替换为更稳定的pd.concat拼接方式,避免merge的隐式类型转换坑:
    # 所有单列表格统一为datetime索引后,按轴1拼接,自动按日期对齐保留全量行
    mergedDf = pd.concat([ds1, ds2, ds3, ds4], axis=1, join='outer')
    
  3. 如果后续要混入季度频率的变量,拼接完成后可以通过resample方法按需对齐到统一频率,全程不会因为类型问题丢失月度/季度的原始行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 21:45:03