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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:37:04