Python读取不同目录XLSX文件时数字类型不一致问题排查
问题分析与解决方案
嘿,这个问题我之前做新旧数据集对比的时候也踩过类似的坑,咱们一步步拆解来看:
首先可以明确:这个问题不全是numpy导致的,是Excel存储特性、不同库的读取策略共同作用的结果,numpy只是扮演了“背锅”的角色,具体原因如下:
1. Excel底层存储的隐形差异
哪怕你手动统一了单元格的显示格式,Excel底层对数值的存储可能还是不一样——比如有的单元格看起来是整数,但实际因为曾经编辑过(比如输入过小数再删掉),底层依然保留了浮点数的存储标记;或者某个文件的B列里存在空值/异常值,Excel自动把整列的存储类型改成了浮点。这种差异用肉眼看不到,但会被Python的读取库捕捉到。
2. 不同库的读取逻辑差异
- openpyxl:是逐单元格读取Excel的原始数据,会严格保留Excel单元格的原始类型(比如long整数、普通float),所以你看到第一个文件里B1是long、B15是float。
- pandas:默认会对整列的类型做统一推断,为了保证数据的一致性,它会用numpy的数值类型来存储(比如numpy.float64)——只要列里有一个浮点值,整列都会被转成numpy.float64类型,这就是第二个文件类型变化的核心原因。
3. numpy的角色
numpy是pandas存储数值数据的底层依赖,所以pandas统一类型时会用到numpy的类型,但这不是numpy主动“改变”了类型,而是pandas的类型推断策略选择了用numpy类型来统一存储。
针对数据集对比的解决方法
要顺利对比新旧数据集,核心是统一数值类型,这里给你几个实用方案:
方案一:读取时强制指定类型(推荐用pandas)
用pd.read_excel()的dtype参数直接指定列的类型,从源头统一:
import pandas as pd # 强制把B列转成float类型,不管原始类型是什么 df_old = pd.read_excel("old_file.xlsx", dtype={"B": float}) df_new = pd.read_excel("new_file.xlsx", dtype={"B": float}) # 之后就可以直接对比了 diff = df_old["B"].compare(df_new["B"])
方案二:读取后统一转换类型
如果已经读取了数据,用astype()做批量转换:
# 转成float df_old["B"] = df_old["B"].astype(float) df_new["B"] = df_new["B"].astype(float) # 如果需要整数,先处理空值再转换(避免报错) df_old["B"] = df_old["B"].fillna(0).astype(int) df_new["B"] = df_new["B"].fillna(0).astype(int)
方案三:用openpyxl读取后统一处理
如果坚持用openpyxl,可以遍历单元格统一转换类型:
from openpyxl import load_workbook def standardize_cell_values(file_path): wb = load_workbook(file_path) ws = wb.active # 遍历B列的目标单元格(比如1到15行) for row in range(1, 16): cell = ws[f"B{row}"] if cell.value is not None: cell.value = float(cell.value) # 统一转成float return wb wb_old = standardize_cell_values("old_file.xlsx") wb_new = standardize_cell_values("new_file.xlsx")
内容的提问来源于stack exchange,提问作者Sam Jinko
相关产品推荐
相关产品推荐

