pandas中迭代时间序列数据触发Timestamp类型KeyError的解决办法
错误原因
你遇到的报错不是iterrows()修改了索引类型导致的,核心问题是pandas中直接用df[索引值]的语法默认是选取列,而非选取行,所以你传入时间戳索引会触发KeyError。要按行索引取值需要用.loc属性,将你的遍历代码修改为以下形式即可正常运行:
for d, r in h2.iterrows(): print(d, h2.loc[d])
更适合pandas时间序列的处理方法
绝大多数场景下都不推荐用for循环遍历pandas数据,向量化操作的性能远高于循环遍历,可选方案包括:
- 如果你需要逐行处理数据,优先用
apply方法:
例如需要对每一行的收盘价做计算,可以直接对行维度做apply操作:def process_row(row): # 自定义处理逻辑,示例:计算当日高低价差 return row['High'] - row['Low'] h2['price_range'] = h2.apply(process_row, axis=1) - 如果你只需要基于时间索引做筛选,直接用时间切片语法,性能远高于循环:
例如筛选2021年10月15日到10月19日的所有数据:period_data = h2['2021-10-15':'2021-10-19'] - 如果必须要遍历,除了
iterrows()之外,也可以选择性能更好的itertuples()方法,返回命名元组,访问属性更方便、速度更快:for row in h2.itertuples(): # 可以直接通过属性名访问索引和字段 print(row.Index, row.Close, row.Volume) - 如果需要做时间序列特有的滚动计算、重采样等操作,直接用pandas内置的时间序列方法,不需要自行遍历:
示例1:计算5日滚动平均收盘价
示例2:将日线数据重采样为周线数据h2['ma5'] = h2['Close'].rolling(5).mean()weekly_data = h2.resample('W').agg({ 'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last', 'Volume': 'sum' })
内容的提问来源于stack exchange,提问作者nitin
相关产品推荐
相关产品推荐

