forex_python报错Currency Rates source not ready及返回NaN问题咨询
报错诱因
你使用的forex-python库底层调用欧洲中央银行的公开汇率数据源,该数据源仅在周一至周五工作日发布当日汇率,周末及对应地区法定假日不更新数据,查询这些时段的汇率时就会抛出Currency Rates Source Not Ready错误,对应返回空值最终显示为NaN。
你猜测的时段限制实际是时区差异导致:欧央行通常在中欧时间工作日下午更新汇率,换算为北美时区对应上午时段,工作日非更新时段查询会自动返回最近一个工作日的有效汇率,不会触发报错。
问题解决办法
分两种场景处理:
- 允许周末使用最近有效汇率:调用接口前将查询日期自动替换为最近一个工作日的日期,即可正常拿到汇率值
- 不需要周末数据:直接过滤掉所有周末、法定假日的查询请求,不发起接口调用即可
如果需要覆盖7*24小时的实时汇率查询,可以更换其他支持全时段汇率查询的API接口使用。
预过滤非有效时段的实现示例
首先修正现有代码中重复导入、重复初始化的冗余问题,新增日期校验逻辑,避免无效请求和NaN返回:
from forex_python.converter import CurrencyRates import pandas as pd import datetime c = CurrencyRates() # 生成时间序列 df = pd.DataFrame(pd.date_range(start='8/16/2021 10:00:00', end='8/22/2021 11:00:00', freq='600min'), columns=['DateTime']) def get_rate(x): # 先判断是否为周末:weekday返回0-4为周一到周五,5、6为周六周日 if x.weekday() >=5: # 场景1:需要补值的话,计算最近一个周五的日期 offset = max(1, x.weekday() -4) work_date = x - datetime.timedelta(days=offset) x = work_date # 场景2:不需要补值直接返回None/指定值的话,这里直接return None即可 try: op = c.get_rate('CAD', 'USD', x) except Exception as re: print(re) op=None return op df['Rate'] = df['DateTime'].apply(get_rate)
运行后原周末时段的NaN会自动填充为2021年8月20日(最近工作日)的汇率值,不会再触发报错。
内容的提问来源于stack exchange,提问作者NewInPython
相关产品推荐
相关产品推荐

