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

使用Python填补股票1分钟K线CSV文件时间间隙的问题求助

解决股票1分钟CSV补全时的填充错误问题

问题说明

  • 需求:处理1分钟间隔的股票价格CSV文件,当某时间点无交易数据时,用下一个有交易时间点的数据填补该空白行。
  • 异常情况:删除文件前5分钟数据后,第一个有效时间戳为04:06:00,预期04:00:00至04:05:00的空白行都用04:06:00的数据填充,但实际04:01:00却使用了04:07:00的数据。

原代码错误原因

原代码的核心逻辑缺陷:

  1. 每次仅处理一个缺失时间点,就立刻将csv_next_data更新为当前行数据,导致后续缺失时间点直接使用下一行的交易数据。
  2. 未处理连续多个缺失时间点的场景,循环一次仅补全一个时间点,无法批量填充一段连续的空白区间。

修正后的代码

import csv
from datetime import datetime, timedelta

csv_path = "D:/Stockmarket-data/frd_complete_sample/"

def parse_timestamp(ts_str):
    return datetime.strptime(ts_str, "%Y-%m-%d %H:%M:%S")

with open(csv_path + "SPY_1min_sample_mod.csv", "r") as source, \
     open(csv_path + "SPY_1min_sample_noGap.csv", "w", newline="") as target:
    csv_reader = csv.reader(source)
    csv_writer = csv.writer(target)

    # 写入表头
    header = next(csv_reader)
    csv_writer.writerow(header)

    # 读取所有有效数据并解析时间戳
    valid_data = []
    for row in csv_reader:
        ts = parse_timestamp(row[0])
        valid_data.append( (ts, row[1:]) )
    
    if not valid_data:
        exit()
    
    # 定义起始时间和结束时间
    start_dt = datetime(valid_data[0][0].year, valid_data[0][0].month, valid_data[0][0].day, 4, 0, 0)
    end_dt = valid_data[-1][0]
    
    # 跟踪下一个有效数据的索引
    next_data_idx = 0
    current_dt = start_dt
    
    while current_dt <= end_dt:
        # 找到第一个大于等于当前时间的有效数据
        while next_data_idx < len(valid_data) and valid_data[next_data_idx][0] < current_dt:
            next_data_idx += 1
        
        # 用下一个有效数据填充
        if next_data_idx < len(valid_data):
            fill_data = valid_data[next_data_idx][1]
        else:
            # 极端情况:如果当前时间超过所有有效数据,用最后一条数据填充
            fill_data = valid_data[-1][1]
        
        # 构造新行并写入
        new_row = [current_dt.strftime("%Y-%m-%d %H:%M:%S")] + fill_data
        csv_writer.writerow(new_row)
        
        # 时间步进1分钟
        current_dt += timedelta(minutes=1)

代码说明

  1. 数据预读取:先把所有有效交易数据读取并解析为(时间戳, 行情数据)的列表,方便后续快速查找。
  2. 时间序列生成:从指定的起始时间04:00:00到最后一条交易数据的时间,生成每分钟的时间序列。
  3. 填充逻辑:通过索引跟踪下一个有效数据的位置,确保所有在当前时间到下一个有效时间之间的空白行,都使用同一个下一行数据填充。
  4. 边界处理:如果当前时间超过所有有效数据的时间,用最后一条数据填充(可根据需求调整)。

验证效果

用提供的样本数据测试后:

  • 04:00:00至04:05:00的所有空白行,均使用04:06:00的行情数据填充。
  • 04:13:00使用04:14:00的数据填充,04:15:00使用04:16:00的数据填充,完全符合需求。

内容的提问来源于stack exchange,提问作者Marco Poulsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:42:03