使用Python pandas按时间列合并多个时序CSV为Excel的解决方案
原代码问题说明
你写的代码存在几个核心逻辑错误,导致无法得到正确合并结果:
- 循环读取文件时未正确关联当前遍历到的文件名,始终读取同一个固定文件
- 存储时间、数值的列表为全局变量,每次循环都会累加历史文件的所有数据,无法生成单文件对应的独立DataFrame
- 合并逻辑错误,每次执行merge都是将当前df和自身合并,未和已累积的合并结果做关联
- df_combine初始化方式错误,
pd.DataFrame是类对象引用而非空表实例 - 同一个CSV重复读取两次,IO开销翻倍,处理数百个文件时效率极低
高效实现方案
不需要逐次调用merge,直接按索引横向拼接的方式性能更好,适配数百个文件的批量处理场景,代码如下:
import os import pandas as pd # 配置参数 csv_folder = "你的CSV文件所在文件夹路径" # 替换成实际路径 output_excel_path = "合并后时序数据.xlsx" # 输出的Excel文件路径 join_method = "outer" # outer=保留所有文件出现的所有时间点,inner=仅保留所有文件共有的时间点 # 遍历读取所有CSV df_list = [] for file in os.listdir(csv_folder): # 跳过非CSV文件 if not file.lower().endswith(".csv"): continue file_path = os.path.join(csv_folder, file) # 单次读取整个CSV,不用分两次读列 df = pd.read_csv(file_path) # 将time列设为索引,方便后续横向拼接,列名默认使用文件自带的第二列表头(即文件名) # 如果需要去掉列名里的.csv后缀,打开下面这行注释即可 # df = df.rename(columns={df.columns[1]: os.path.splitext(file)[0]}) df = df.set_index("time") df_list.append(df) # 横向拼接所有表 df_combine = pd.concat(df_list, axis=1, join=join_method).reset_index() # 导出到Excel df_combine.to_excel(output_excel_path, index=False)
注意事项
- 如果不同CSV里的time列格式不统一(比如部分是时间戳、部分是字符串),可以在读取后统一转换格式,比如
df["time"] = df["time"].astype(str),避免相同时间点匹配失败 - 如果存在重复时间点的行,建议读取后先做去重:
df = df.drop_duplicates(subset="time", keep="last"),避免拼接时出现行膨胀 - 数百个文件导出Excel时如果遇到行数/列数超限问题,可以换用
.to_csv()导出csv格式,兼容性更好
内容的提问来源于stack exchange,提问作者DontKnowHowToCode
相关产品推荐
相关产品推荐

