You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:12:41