ib_insync中util.df()转换数据时触发AttributeError问题求助
解决ib_insync转DataFrame时的AttributeError错误
错误原因
你遇到的AttributeError: 'NoneType' object has no attribute 'total_seconds',是因为pandas处理带时区的datetime字段时,时区相关对象为空导致的。这通常是reqHistoricalData中formatDate=1返回的datetime对象时区信息不完整,和当前pandas版本的时区处理逻辑冲突引发的。
解决方案
方案1:修改formatDate参数为2
把formatDate从1改成2,让IB返回自1970年以来的时间戳(秒数),直接避开时区处理问题。修改后的代码如下:
from ib_insync import * ib = IB() ib.connect('127.0.0.1',4001,clientId=1) print(ib.isConnected()) contract = Stock('MSFT', 'SMART', 'USD') bars = ib.reqHistoricalData( contract, durationStr='30 D', endDateTime='', barSizeSetting='1 hour', whatToShow='MIDPOINT', useRTH=True, formatDate=2 # 改为2返回时间戳 ) df = util.df(bars) print(df)
方案2:手动处理时区信息
如果需要保留datetime格式,可在转换DataFrame前手动移除时区信息:
from ib_insync import * ib = IB() ib.connect('127.0.0.1',4001,clientId=1) print(ib.isConnected()) contract = Stock('MSFT', 'SMART', 'USD') bars = ib.reqHistoricalData( contract, durationStr='30 D', endDateTime='', barSizeSetting='1 hour', whatToShow='MIDPOINT', useRTH=True, formatDate=1 ) # 移除每个bar的date字段时区信息 for bar in bars: bar.date = bar.date.replace(tzinfo=None) df = util.df(bars) print(df)
或者转换为DataFrame后再处理:
df = util.df(bars) df['date'] = df['date'].dt.tz_localize(None) print(df)
内容的提问来源于stack exchange,提问作者Rory Murray
相关产品推荐
相关产品推荐

