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

如何从分钟级股票CSV数据中提取每日特定时间点价格并计算差值

问题背景

你有一份列包含日期、时间、股票数值的分钟级股票行情CSV文件,需要提取每日时间为100000和160000两个时间点的股价,计算二者差值并输出每日结果。

初始代码错误分析

出现NameError以及逻辑错误的核心原因有三点:

  • 文件对象是迭代器,第一次调用f.readlines()会把文件指针移动到末尾,第二次嵌套循环里再调用f.readlines()会直接返回空列表,永远不会触发Spot和Close的赋值逻辑,自然会报变量未定义的错误。
  • 嵌套循环设计逻辑完全错误,外层遍历每一行的同时内层又重新遍历整个文件,会产生大量无效重复计算,且取值时错误使用了存储日期的split[2]作为股价,就算赋值成功计算的也是无效的日期差值。
  • 没有做边界判断,完全没有考虑某一天可能缺失100000或160000行情数据的场景,只要缺一个数据就会触发变量未定义报错。
自行调试后代码的合理性评估

你调整后的代码已经可以跑出正确结果,但仍然存在可优化的空间:

  • 时间效率偏低:需要两次遍历全量数据,先收集日期再遍历匹配日期,虽然小数据集无感知,但大数据量下性能会有明显下降。
  • 代码冗余:遍历行时已经可以直接通过row对象取值,不需要额外维护index变量,多余的索引逻辑会降低代码可读性。
  • 没有异常兼容:如果某一天缺失其中一个时间点的数据,已经赋值的价格会错带到下一个日期的计算中,导致结果出错。
更优实现方案

方案1:纯标准库单遍历实现(O(n)复杂度,无需提前收集日期)

只需要遍历一次全量数据,自动处理日期分组,同时兼容缺失数据的场景,逻辑清晰效率更高:

import csv
filename = "C:\\...\\US_200901_210907.csv"

date_price_map = {}

with open(filename, 'r') as f:
    reader = csv.reader(f, delimiter=';')
    next(reader)  # 跳过表头
    for row in reader:
        date = row[2]
        time = row[3]
        # 只处理目标时间点的数据,其他行直接跳过
        if time not in ('100000', '160000'):
            continue
        price = float(row[7])
        # 初始化对应日期的存储结构
        if date not in date_price_map:
            date_price_map[date] = {}
        date_price_map[date][time] = price

# 遍历计算差值
for date, prices in date_price_map.items():
    if '100000' in prices and '160000' in prices:
        diff = prices['100000'] - prices['160000']
        print(f"日期:{date},10点价格:{prices['100000']},16点价格:{prices['160000']},差值:{diff}")
    else:
        print(f"日期:{date} 缺失10点或16点行情数据,跳过计算")

方案2:pandas实现(适合大数据量,代码更简洁)

如果你的数据量较大,用pandas可以大幅简化代码,自动完成过滤、分组、缺失值处理的逻辑:

import pandas as pd

# 读取CSV,指定分隔符为分号
df = pd.read_csv("C:\\...\\US_200901_210907.csv", sep=';')
# 过滤出两个目标时间点的数据
filter_df = df[df['时间列名'].isin(['100000', '160000'])]
# 按日期分组,把两个时间点的价格转成独立列,自动删除缺失数据的日期
pivot_df = filter_df.pivot(index='日期列名', columns='时间列名', values='股价列名').dropna()
# 计算差值
pivot_df['差值'] = pivot_df['100000'] - pivot_df['160000']
# 输出结果
print(pivot_df[['100000', '160000', '差值']])

注意把代码中的时间列名、日期列名、股价列名替换为你CSV实际的表头字段即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:12:01