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
相关产品推荐
相关产品推荐

