时间序列数据ValueError:JPYBasket等品种重复轴报错排查
解决fxcmpy获取篮子数据时的"cannot reindex from a duplicate axis"错误
从你贴的JPYBasket数据示例就能一眼定位问题:篮子类品种(比如JPYBasket、EMBasket)返回的数据里存在重复的日期索引(比如2019-04-26出现了两行记录),而EUR/USD这类单一货币对的K线数据不会有这种情况,所以执行pd.to_datetime重索引操作时就触发了ValueError。
这种情况是fxcmpy返回篮子数据的常见问题——某些日期会有多条记录(比如包含结算调整数据或无效的零交易量条目),直接处理就会打破pandas对索引唯一性的要求。下面是两种实用的解决方法:
方法1:保留每个日期的最后一条记录
直接去除重复索引,保留每个日期最后出现的那一行数据,这是最通用的处理方式:
import fxcmpy import pandas as pd import datetime from datetime import date import numpy as np TOKEN = "hidden" con = fxcmpy.fxcmpy(access_token=TOKEN, log_level='error') print(con.get_instruments()) symbols = con.get_instruments() ticker = 'JPYBasket' start = datetime.datetime(2008,1,1) end = datetime.datetime.today() today = date.today() start1 = datetime.datetime(2019,1,1) # 获取原始数据 data = con.get_candles(ticker, period='D1', start = start, end = end) data1 = con.get_candles(ticker, period='D1', start = start1, end = end) # 关键步骤:去除重复索引,保留每个日期的最后一条记录 data = data[~data.index.duplicated(keep='last')] data1 = data1[~data1.index.duplicated(keep='last')] # 现在执行索引转换就不会报错了 data.index = pd.to_datetime(data.index, format ='%Y-%m-%d') data1.index = pd.to_datetime(data1.index, format ='%Y-%m-%d')
方法2:过滤掉零交易量的无效行
观察你的数据示例,重复日期里有一行tickqty为0(通常是无效的空数据),你也可以直接过滤这类条目,同时解决重复索引问题:
# 替换上面的去重步骤为: data = data[data['tickqty'] != 0] data1 = data1[data1['tickqty'] != 0]
两种方法都能解决你的问题,你可以按需选择:如果只需要保证索引唯一,方法1足够;如果要确保数据都是有实际交易的有效K线,方法2更合适。
内容的提问来源于stack exchange,提问作者Slartibartfast
相关产品推荐
相关产品推荐

