函数结果无法存入数组:'int'对象无'split'属性报错解决
问题解决:AttributeError: 'int' object has no attribute 'split'
问题说明
需要将类似"2000,12"的字符串转换为2000-Dec格式,单独调用转换函数ex1_b("2000,12")可以正常输出,但循环将date数组元素传入函数时,出现以下报错:
AttributeError Traceback (most recent call last) Cell In[460], line 4 1 new_format = [] 3 for i in range (0, len(date)): ----> 4 new_format.append(ex1_b(date[i])) 6 print(new_format) Cell In[459], line 15, in ex1_b(date) 11 f_date = date_val[date_val.columns[0]] 12 # f_date = date_val[date_val.columns[0]] 13 # s_value = date_val.iloc[:,1].values ---> 15 years = int(date.split(",")[0]) # even if I change to str() no change 16 months = int(date.split(",")[1]) 17 # matrix_b.to_csv("matrix-B.csv", index=False) 18 # input = [int(i) for i in date.split(",")] 19 # input = [int(i) for i in f_date.str.split(",")] AttributeError: 'int' object has no attribute 'split'
用户代码如下:
date_val = {'date' : [], 'value' : []} for i in range(0, 25): for j in range(0, 12): month = str(j+1).zfill(2) date_val['date'].append( str(year[i]) + "," + month) date_val['value'].append(df.loc[i,j+1]) date.append(str(year[i]) + "," + month) value.append(df.loc[i,j+1]) date_val = pd.DataFrame(date_val) mon = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] def ex1_b(date:str): f_date = date_val[date_val.columns[0]] #IN CASE I WILL NEED IT years = int(date.split(",")[0]) months = int(date.split(",")[1]) if(years<2022 or years>1996 or months>0 or months<13): year_month = f"{str(years)}-{mon[months-1]}" return year_month print(ex1_b("2000,12")) #WORKS # THE PROBLEM new_format = [] for i in range (0, len(date)): new_format.append(ex1_b(date[i])) print(new_format)
问题根源
报错明确指出:传入ex1_b的参数是整数类型,而整数没有split()方法。这说明date数组中存在整数元素,并非全是预期的"YYYY,MM"格式字符串。可能是date数组在循环前被错误初始化,或者year[i]的类型导致拼接时出现异常,也可能是其他代码修改了date数组的元素类型。
修复方案
方案1:强制将输入转为字符串(最直接)
修改循环调用的代码,确保传入函数的是字符串:
new_format = [] for i in range (0, len(date)): # 强制转成字符串后再传入函数 new_format.append(ex1_b(str(date[i])))
方案2:在函数内部做类型处理
修改ex1_b函数,先将输入转为字符串,同时修正条件判断的逻辑错误(原条件用or会导致所有情况都满足,应该用and限定合法范围):
mon = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] def ex1_b(date_input): # 先将输入转为字符串,避免整数传入报错 date = str(date_input) # 拆分年份和月份 year_str, month_str = date.split(",") years = int(year_str) months = int(month_str) # 修正条件:年份在1996-2022之间,月份在1-12之间 if 1996 <= years <= 2022 and 1 <= months <= 12: year_month = f"{years}-{mon[months-1]}" else: # 处理非法格式,返回原字符串或自定义提示 year_month = date return year_month
方案3:检查date数组的初始化和填充
确保date数组在循环前是一个空列表,且循环中只添加字符串:
# 提前初始化空列表,避免之前的变量污染 date = [] value = [] date_val = {'date' : [], 'value' : []} for i in range(0, 25): for j in range(0, 12): month = str(j+1).zfill(2) date_str = f"{year[i]},{month}" # 统一拼接成字符串 date_val['date'].append(date_str) date_val['value'].append(df.loc[i,j+1]) date.append(date_str) value.append(df.loc[i,j+1]) date_val = pd.DataFrame(date_val)
额外优化:用Pandas内置方法更高效
既然已经有了date_val DataFrame,完全可以不用循环,直接用Pandas的字符串处理和映射功能完成转换,代码更简洁高效:
mon = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] # 创建月份数字到缩写的映射字典 month_map = {str(i+1).zfill(2): mon[i] for i in range(12)} # 拆分date列,并映射月份 date_val[['year', 'month']] = date_val['date'].str.split(',', expand=True) date_val['formatted_date'] = date_val['year'] + '-' + date_val['month'].map(month_map) # 提取结果到列表 new_format = date_val['formatted_date'].tolist()
内容的提问来源于stack exchange,提问作者Nuran Gozalova
相关产品推荐
相关产品推荐

