如何用pandas concat合并起始时间戳不同的多份CSV交易数据文件
解决多CSV时间序列合并的对齐与过滤问题
你的代码出现重复timestamp列、数据对齐混乱的核心原因是没有将时间戳设为索引,concat时只是按行位置硬拼,而非按时间对齐。同时缺少对短时间范围文件的过滤逻辑,导致无效数据混入。以下是修正方案:
关键步骤说明
- 统一时间索引:将每个CSV的timestamp转为datetime类型并设为索引,让pandas合并时自动按时间对齐
- 过滤短数据文件:通过数据行数或时间跨度筛选掉不符合要求的文件,减少无效缺失值
- 按索引合并:用
pd.concat按列合并,自动对齐时间,缺失值补NaN
完整代码
import pandas as pd # 读取交易对列表 symbols = pd.read_csv('symbols.csv')['symbols'].tolist() # 存储符合条件的DataFrame valid_dfs = [] # 自定义过滤规则:比如要求数据至少覆盖90天,或行数不低于10000(按需调整) min_days = 90 # 也可以用行数阈值:min_rows = 10000 for symbol in symbols: try: # 读取目标列 df = pd.read_csv(f"OHLC/5m/{symbol}.csv", usecols=['timestamp', 'close']) # 转换时间戳为datetime(如果是毫秒级时间戳用unit='ms',秒级则去掉) df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms') # 计算时间跨度 time_span = df['timestamp'].max() - df['timestamp'].min() # 过滤掉时间过短的文件 if time_span >= pd.Timedelta(days=min_days): # 将时间戳设为索引,用于后续对齐 df.set_index('timestamp', inplace=True) # 重命名close列为交易对名称,避免列名冲突 df.rename(columns={'close': symbol}, inplace=True) valid_dfs.append(df) else: print(f"跳过 {symbol}:时间跨度仅 {time_span.days} 天,未达{min_days}天要求") except Exception as e: print(f"处理 {symbol} 失败:{str(e)}") # 按时间索引合并所有有效DataFrame merged_df = pd.concat(valid_dfs, axis=1) # 可选:如果需要只保留所有交易对都有数据的时间区间 # 过滤掉全NaN的行(即某时间点所有交易对都无数据) merged_df = merged_df.dropna(how='all') # 查看结果 print(merged_df.head())
代码细节解释
- 时间索引处理:把timestamp设为索引后,concat时会自动匹配相同时间戳的行,不会生成重复的timestamp列,彻底解决结构混乱问题
- 过滤逻辑:这里用时间跨度(90天)作为过滤条件,你也可以换成行数阈值,比如要求至少10000条数据,完全根据你的数据集情况调整
- 合并后优化:
dropna(how='all')可以去掉所有交易对都无数据的时间点,进一步精简有效数据范围
内容的提问来源于stack exchange,提问作者Royce Anton Jose
相关产品推荐
相关产品推荐

