Yahoo外汇数据日期异常求助:DataReader数据偏移及缺失问题
问题原因分析与解决方案
为何会出现日期偏移、缺失及异常日期?
这是Yahoo Finance外汇历史数据的常见问题,核心原因有三个:
- 时区不匹配:Yahoo的外汇数据默认以UTC时区存储,而你请求时用的是本地系统时区(比如北京时间),时区差会导致日期显示提前1-2天。比如你请求2012-09-27(本地时间),UTC时区可能还未到该日期,因此返回了前一个交易日(2012-09-25)的数据。
- 数据源归档bug:2015年之前的外汇数据偶尔存在日期标记错误,比如把周五的结算数据错标为周日,或是因同步问题缺失部分周五记录——外汇市场是周一至周五交易,周日本不应有数据,这明显是后台数据的归档失误。
- 结算周期差异:外汇收盘价是当日结算价,部分数据源会提前将前一交易日的结算价关联到新日期,从而导致起始日期偏移。
校准日期与修复异常的具体方法
以下是一步步的代码解决方案,帮你把数据校准到预期范围和格式:
1. 时区校准+过滤非交易日
先把数据索引转换为正确时区,再剔除周六、周日的异常数据:
import pandas as pd import datetime from pandas_datareader import data as web # 原始请求代码 start = datetime.datetime(2012,9,27) end = datetime.datetime(2013,12,31) n = 'GBPUSD=X' us = web.DataReader(n, 'yahoo', start, end) # 将索引转换为UTC时区,再转成纽约时区(外汇核心交易时区) us.index = us.index.tz_localize('UTC').tz_convert('America/New_York') # 过滤掉周六(dayofweek=5)和周日(dayofweek=6)的数据 us = us[us.index.dayofweek < 5] # 强制保留请求的日期范围,去掉早于start的记录 us = us.loc[start:]
2. 修复缺失的周五数据
针对缺失的交易日数据,可根据需求选择填充方式:
- 前向填充(ffill):用前一交易日收盘价填充,适合短期缺失:
us['Close'] = us['Close'].ffill()
- 线性插值:根据前后交易日数据生成平滑插值,适合保留趋势:
us['Close'] = us['Close'].interpolate(method='linear')
- 手动补充:如果缺失的是关键日期,可以查其他权威数据源(如OANDA)手动填入正确值。
3. 验证数据准确性
处理完后,用以下代码检查是否修复到位:
# 检查是否还存在周日数据 print(us[us.index.dayofweek == 6]) # 确认起始日期是否符合要求 print(f"处理后起始日期:{us.index[0].date()}")
内容的提问来源于stack exchange,提问作者Cronos
相关产品推荐
相关产品推荐

