使用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的数据。
原代码错误原因
原代码的核心逻辑缺陷:
- 每次仅处理一个缺失时间点,就立刻将
csv_next_data更新为当前行数据,导致后续缺失时间点直接使用下一行的交易数据。 - 未处理连续多个缺失时间点的场景,循环一次仅补全一个时间点,无法批量填充一段连续的空白区间。
修正后的代码
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)
代码说明
- 数据预读取:先把所有有效交易数据读取并解析为
(时间戳, 行情数据)的列表,方便后续快速查找。 - 时间序列生成:从指定的起始时间
04:00:00到最后一条交易数据的时间,生成每分钟的时间序列。 - 填充逻辑:通过索引跟踪下一个有效数据的位置,确保所有在当前时间到下一个有效时间之间的空白行,都使用同一个下一行数据填充。
- 边界处理:如果当前时间超过所有有效数据的时间,用最后一条数据填充(可根据需求调整)。
验证效果
用提供的样本数据测试后:
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
相关产品推荐
相关产品推荐

