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

Python构建datetime对象时出现float无法转为整数错误求助

解决datetime构造时的float转int报错问题

问题代码及报错

数据下载函数

def download_data_ibovespa_file():
    url = 'http://bvmf.bmfbovespa.com.br/indices/download/IBOVDIA.zip'
    urllib.request.urlretrieve(url, 'IBOVDIA.zip')
    with zipfile.ZipFile('IBOVDIA.zip', 'r') as zip_ref:
        zip_ref.extractall('.')

数据读取与处理函数

def read_ibovespa_year_file(year):
    x=pd.read_excel("IBOVDIA.XLS",sheet_name=str(year),
                   skiprows=2,nrows=31,header=None,
                   names=["Dia"]+list(range(1,13)))
    #add year variable
    x["Ano"]=year
    x = pd.melt(x, id_vars=["Ano", "Dia"],
                       var_name="mes", value_name="IBOV")

    ### manipulating date vector
    x=x.dropna()
    # set the years, months and days vectors
    dias = x["Dia"]
    meses = x["mes"]
    anos = x["Ano"]
    # list to store dates
    datas = []
# Loop to create dates vector
    for dia, mes, ano in zip(dias, meses, anos):
      # date obs for each row
      y = dt.datetime(ano, mes, dia)
      # Adiciona a data formatada ao vetor de datas
      datas.append(y.strftime("%Y-%m-%d"))
    x["Datas"]=datas
    x = x.drop(['Ano', 'mes', 'Dia'], axis=1)
    return x

循环执行代码

data=[]
for i in range(1970,1972):
    data.append(read_ibovespa_year_file(i))

报错信息

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[55], line 3
      1 data=[]
      2 for i in range(1970,1972):
----> 3     data.append(read_ibovespa_year_file(i))

Cell In[48], line 21, in read_ibovespa_year_file(year)
     18 # Loop to create dates vector
     19     for dia, mes, ano in zip(dias, meses, anos):
     20       # date obs for each row
---> 21       y = dt.datetime(ano, mes, dia)
     22       # Adiciona a data formatada ao vetor de datas
     23       datas.append(y.strftime("%Y-%m-%d"))

TypeError: 'float' object cannot be interpreted as an integer

报错原因

dt.datetime()构造函数要求年、月、日参数必须是整数类型,但从Excel读取的Dia列、melt后的mes列,甚至Ano列可能因为Excel单元格格式或空值处理的原因,被识别为float类型,导致传入时触发类型错误。

解决方案

方案1:循环内强制转换类型

修改循环中的日期构造代码,将每个参数转为整数:

for dia, mes, ano in zip(dias, meses, anos):
    # 强制转换为整数
    ano_int = int(ano)
    mes_int = int(mes)
    dia_int = int(dia)
    y = dt.datetime(ano_int, mes_int, dia_int)
    datas.append(y.strftime("%Y-%m-%d"))

方案2:提前转换列类型(更推荐)

在x=x.dropna()之后,统一将日期相关列转为整数类型,避免循环内重复转换:

### manipulating date vector
x=x.dropna()
# 转换日期相关列为整数类型
x["Dia"] = x["Dia"].astype(int)
x["mes"] = x["mes"].astype(int)
x["Ano"] = x["Ano"].astype(int)
# set the years, months and days vectors
dias = x["Dia"]
meses = x["mes"]
anos = x["Ano"]
# 后续代码保持不变

方案3:用Pandas内置函数替代循环(最优)

直接使用Pandas的pd.to_datetime()函数处理日期,无需手动循环,代码更简洁高效:

### manipulating date vector
x=x.dropna()
# 转换列类型并生成日期列
x["Datas"] = pd.to_datetime(x[["Ano", "mes", "Dia"]].astype(int))
x["Datas"] = x["Datas"].dt.strftime("%Y-%m-%d")
# 移除冗余列
x = x.drop(['Ano', 'mes', 'Dia'], axis=1)
return x

这个方案完全替代了原来的循环代码,利用Pandas向量化操作提升效率,同时避免类型问题。

内容的提问来源于stack exchange,提问作者Josué Costa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:17:10