You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用pandas concat合并起始时间戳不同的多份CSV交易数据文件

解决多CSV时间序列合并的对齐与过滤问题

你的代码出现重复timestamp列、数据对齐混乱的核心原因是没有将时间戳设为索引,concat时只是按行位置硬拼,而非按时间对齐。同时缺少对短时间范围文件的过滤逻辑,导致无效数据混入。以下是修正方案:

关键步骤说明

  1. 统一时间索引:将每个CSV的timestamp转为datetime类型并设为索引,让pandas合并时自动按时间对齐
  2. 过滤短数据文件:通过数据行数或时间跨度筛选掉不符合要求的文件,减少无效缺失值
  3. 按索引合并:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:20:53