使用Python Pandas合并600个同结构CSV时间序列文件的问题
解决CSV合并时DateTime列异常的问题
嘿,我一眼就看出问题出在哪了——你用了pd.concat的axis=1参数,这是按列拼接(把三个表并排放在一起),三个文件的DateTime列会被同时保留,当你把它设为索引时,Pandas就把这三列的组合值当成了索引,所以才会出现('12/18/2017 10:00:00', ...)这种奇怪的元组值。
你需要的是按行拼接(把所有数据行堆叠在一起),这时候应该用axis=0(这也是pd.concat的默认值,甚至可以省略不写)。另外,建议读取CSV时就把DateTime解析为日期时间类型,这样后续排序和索引操作会更顺畅。
修正后的测试代码
import pandas as pd # 读取文件时直接解析DateTime列为日期类型,避免后续排序出错 df1 = pd.read_csv(r"E:\Business\Economic Indicators\Consumer Price Index - Core (YoY) - European Monetary Union.csv", parse_dates=['DateTime']) df2 = pd.read_csv(r"E:\Business\Economic Indicators\Private loans (YoY) - European Monetary Union.csv", parse_dates=['DateTime']) df3 = pd.read_csv(r"E:\Business\Economic Indicators\Current Account s.a - European Monetary Union.csv", parse_dates=['DateTime']) # 按行拼接所有数据(axis=0是默认值,可省略) df = pd.concat([df1, df2, df3], axis=0, ignore_index=True) # 处理可能的重复数据(如果不同文件有同一DateTime的记录,可按需调整规则) df = df.drop_duplicates(subset=['DateTime'], keep='last') # 保留最新的一条记录 # 设置DateTime为索引,并按时间倒序排列(最新时间在前) df.set_index('DateTime', inplace=True) df = df.sort_index(ascending=False) print(df.head()) df.to_csv('merged_economic_test.csv')
批量处理600个CSV的高效代码
既然你有600个同结构的文件,手动逐个读取太浪费时间,用os模块遍历文件夹自动处理更高效:
import pandas as pd import os # 目标文件夹路径(用r前缀避免Windows路径的转义问题) folder_path = r"E:\Business\Economic Indicators" # 初始化空列表,用来存储所有读取的DataFrame all_dfs = [] # 遍历文件夹下所有CSV文件 for filename in os.listdir(folder_path): if filename.endswith('.csv'): file_full_path = os.path.join(folder_path, filename) # 读取文件并解析DateTime列 single_df = pd.read_csv(file_full_path, parse_dates=['DateTime']) all_dfs.append(single_df) # 合并所有DataFrame merged_total_df = pd.concat(all_dfs, axis=0, ignore_index=True) # 去重+设置索引+倒序排序 merged_total_df = merged_total_df.drop_duplicates(subset=['DateTime'], keep='last') merged_total_df.set_index('DateTime', inplace=True) merged_total_df = merged_total_df.sort_index(ascending=False) # 保存最终合并文件 merged_total_df.to_csv('merged_all_economic_indicators.csv')
额外小提示
- 路径前加
r是为了避免Windows系统里的反斜杠被解析成转义字符 drop_duplicates步骤可选:如果不同文件里有同一时间的重复记录,你可以根据需求调整keep参数——keep='first'保留最早的记录,keep='last'保留最晚的,False则删除所有重复项- 提前解析
DateTime为日期类型,能避免字符串排序的bug(比如不会出现"1/1/2024"排在"12/1/2023"后面的错误)
内容的提问来源于stack exchange,提问作者Sayed Gouda
相关产品推荐
相关产品推荐

