Pandas脚本报错numpy has no attribute float,升级版本仍未解决
问题:Pandas 1.5.3 运行时报错
numpy has no attribute float 问题背景
我编写了一个帮助同事维护Excel表格的小型脚本,此前多次使用Pandas库正常运行,本次运行时出现错误:numpy has no attribute float。已执行pip install pandas --upgrade确认使用Pandas 1.5.3版本,安装路径符合预期,同时升级了Numpy至最新版本,但问题仍未解决。
当前代码如下(已补充缺失依赖、修正逻辑小问题):
import pandas as pd import os import sys import shutil from datetime import datetime, timedelta def main(): print("Pandas version:", pd.__version__) print("Pandas installation path:", pd.__file__) show_Folder = input("Please provide file path of folder: ") show_code = input("Please provide show code: ") # 创建保存汇总文件的新文件夹 today = datetime.now() new_folder_name = "A" summary_location = get_current(show_Folder) if not summary_location: print("Error: CURRENT folder not found") sys.exit() new_folder = f"{summary_location}/{today.strftime('%Y%m%d')}{new_folder_name}" while os.path.exists(new_folder): new_folder_name = chr(ord(new_folder_name[-1])+1) new_folder = new_folder[:-1] + new_folder_name try: os.mkdir(new_folder) print("mkdir Executed") except Exception as e: print(f"Error: Could not create folder - {str(e)}") sys.exit() # 复制并重命名汇总模板 print("*** Loading Summary Template *** ") template = f"{show_Folder}/PRODUCTION_RESOURCES/summary_template.xlsx" if not os.path.exists(template): print(f"Error: Template file not found at {template}") sys.exit() shutil.copy(template, new_folder) new_template_name = f"{show_code}_SeasonSummary_{today.strftime('%Y%m%d')}.xlsx" os.rename(f"{new_folder}/summary_template.xlsx", f"{new_folder}/{new_template_name}") seasonSummary = f"{new_folder}/{show_code}_Summary_{today.strftime('%Y%m%d')}.xlsx" # 遍历投标文件 episodes, file_paths = get_bids(show_Folder) print(f"There are: {episodes} Bids in CURRENT folders") for i, path in enumerate(file_paths): make_summary(path, seasonSummary, i) print(path) def get_current(root_folder): for dirpath, dirnames, filenames in os.walk(root_folder): if 'CURRENT' in dirnames: current_path = os.path.join(dirpath, 'CURRENT') if os.path.relpath(current_path, root_folder).count(os.sep) == 1: return current_path return None def make_summary(file_path, target_file_path, offset): # 读取源Excel文件 try: source_data = pd.read_excel(file_path, sheet_name=["Coverpage", "Brkdwn"], engine='openpyxl') except Exception as e: print(f"Error reading {file_path}: {str(e)}") return # 提取指定单元格的数据 data = [ source_data["Brkdwn"].iloc[3:, 9], source_data["Brkdwn"].iloc[4, 27], source_data["Brkdwn"].iloc[8, 21], source_data["Brkdwn"].iloc[5, 27], source_data["Coverpage"].iloc[18, 7], source_data["Coverpage"].iloc[22, 8], source_data["Coverpage"].iloc[22, 7], source_data["Brkdwn"].iloc[7, 9], source_data["Brkdwn"].iloc[8, 9], source_data["Brkdwn"].iloc[8, 9], source_data["Coverpage"].iloc[28, 7], ] # 读取目标Excel文件 try: target_data = pd.read_excel(target_file_path, engine='openpyxl') except Exception as e: print(f"Error reading {target_file_path}: {str(e)}") return # 计算目标行号并处理越界情况 row_num = 14 + offset if row_num >= len(target_data): print(f"Warning: Row {row_num} exceeds target file row count, appending new row") target_data.loc[row_num] = [None]*len(target_data.columns) # 写入数据到目标文件 try: target_data.iloc[row_num, 14] = data[0].to_list() target_data.iloc[row_num, 15] = data[1] target_data.iloc[row_num, 16] = data[2] target_data.iloc[row_num, 17] = data[3] target_data.iloc[row_num, 18] = data[4] target_data.iloc[row_num, 19] = data[5] target_data.iloc[row_num, 20] = data[6] target_data.iloc[row_num, 21] = data[7] target_data.iloc[row_num, 22] = data[8] target_data.iloc[row_num, 23] = data[9] target_data.iloc[row_num, 24] = data[10] # 保存更新后的目标文件 target_data.to_excel(target_file_path, index=False, engine='openpyxl') except Exception as e: print(f"Error writing to {target_file_path}: {str(e)}") def get_bids(root_folder): episodes = 0 file_paths = [] print("Retrieving Bids from CURRENT Folders") for root, dirs, files in os.walk(root_folder): print(f"Progress: Searching {root}", end="\r") if "CURRENT" in dirs: current_folder = os.path.join(root, "CURRENT") for file in os.listdir(current_folder): if file.endswith(".xlsm"): episodes += 1 file_paths.append(os.path.join(current_folder, file)) else: for d1 in dirs: path1 = os.path.join(root, d1) if os.path.isdir(path1): for d2 in os.listdir(path1): path2 = os.path.join(path1, d2) if os.path.isdir(path2): for d3 in os.listdir(path2): path3 = os.path.join(path2, d3) if os.path.isdir(path3) and "CURRENT" in os.listdir(path3): current_folder = os.path.join(path3, "CURRENT") for file in os.listdir(current_folder): if file.endswith(".xlsm"): episodes += 1 file_paths.append(os.path.join(current_folder, file)) return episodes, sorted(file_paths) if __name__ == "__main__": main()
原因分析
Numpy 1.24+版本废弃了numpy.float、numpy.int等旧类型别名,而Pandas 1.5.3是较旧版本,其内部代码仍在调用这些已废弃的Numpy API,导致版本兼容冲突。
解决方案
方案1:降级Numpy到兼容版本
Pandas 1.5.3官方支持的Numpy版本范围是1.18.5 ~ 1.23.5,安装该范围内的版本即可解决冲突:
pip install numpy==1.23.5
方案2:升级Pandas到适配Numpy 1.24+的版本
升级到Pandas 1.5.3之后的版本(如2.0.x及以上),这些版本已修复对Numpy 1.24+的兼容性问题:
pip install pandas --upgrade
注意:升级后需测试脚本兼容性,比如read_excel默认引擎可能变更,需确保安装了openpyxl或xlrd依赖。
方案3:临时兼容补丁(不推荐长期使用)
如果无法修改版本,可在脚本最开头添加以下代码,手动恢复Numpy旧别名:
import numpy as np # 恢复Numpy 1.24+废弃的类型别名 np.float = float np.int = int np.bool = bool np.object = object np.float64 = np.dtype('float64') np.float32 = np.dtype('float32') np.int64 = np.dtype('int64') np.int32 = np.dtype('int32')
此方法仅为临时 workaround,长期建议通过版本适配解决问题。
内容的提问来源于stack exchange,提问作者LMaddalena
相关产品推荐
相关产品推荐

