Pandas加载多CSV合并时间序列时自动转为年度频率的问题排查
核心问题原因
所有合并后只剩年度行的异常,本质是不同DataFrame的索引类型不统一,触发了pandas合并时的隐式类型不兼容匹配逻辑,和频率自动转换没有任何关系:
- 你加载s1时设置了
parse_dates=True,所以ds1的索引是真正的datetime64日期类型;但s2、s3、s4加载时完全没加这个参数:- 哪怕s2的输出打印成
1960-01-01的格式,它的索引本质还是字符串类型,只是恰好是ISO格式字符串 - 你可以从ds3的输出直观看到问题:索引是
01/02/1978格式的原生字符串,根本没被解析成日期对象
- 哪怕s2的输出打印成
- 当你用
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月的行,看起来像自动降成了年度频率。
修复步骤
- 给所有读取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 ) - 把逐次调用merge的合并逻辑,替换为更稳定的
pd.concat拼接方式,避免merge的隐式类型转换坑:# 所有单列表格统一为datetime索引后,按轴1拼接,自动按日期对齐保留全量行 mergedDf = pd.concat([ds1, ds2, ds3, ds4], axis=1, join='outer') - 如果后续要混入季度频率的变量,拼接完成后可以通过
resample方法按需对齐到统一频率,全程不会因为类型问题丢失月度/季度的原始行。
内容的提问来源于stack exchange,提问作者TIMOTHY PETERSON
相关产品推荐
相关产品推荐

