如何用Pandas.read_excel或xlwings读取Excel显示的精确数值
解决Excel数据读取精度丢失问题
方法1:使用decimal类型读取,保留精确值
Pandas可以配合decimal模块,读取时将数值转为Decimal类型,避免浮点数精度损耗。需要用converters参数指定列的转换函数:
import pandas as pd from decimal import Decimal def convert_to_decimal(value): try: return Decimal(str(value)) except: return value df_input = pd.read_excel(excel_path, sheet_name, converters={'Column E': convert_to_decimal})
读取后Column E的数值会以Decimal类型存储,完全保留原始精度。
方法2:读取Excel单元格的显示文本(推荐)
如果要完全获取Excel界面显示的数值,可以用openpyxl直接读取单元格的display_value属性,再转为DataFrame:
import pandas as pd from openpyxl import load_workbook wb = load_workbook(excel_path) ws = wb[sheet_name] # 提取表头和数据 header = [cell.value for cell in ws[1]] data = [] for row in ws.iter_rows(min_row=2): row_data = [] for cell in row: # 读取显示的文本,再尝试转成Decimal保留精度 val = cell.display_value try: row_data.append(Decimal(val)) except: row_data.append(val) data.append(row_data) df_input = pd.DataFrame(data, columns=header)
这个方法直接获取Excel显示的内容,完全匹配你看到的数值。
方法3:xlwings读取显示文本
如果你习惯用xlwings,可以读取单元格的text属性,再构建DataFrame:
import pandas as pd import xlwings as xw wb = xw.Book(excel_path) ws = wb.sheets[sheet_name] # 获取表头和数据区域 header = [cell.value for cell in ws.range('1:1') if cell.value is not None] used_range = ws.used_range data = [] for row in used_range.rows[1:]: row_data = [] for cell in row: val = cell.text try: row_data.append(Decimal(val)) except: row_data.append(val) data.append(row_data) df_input = pd.DataFrame(data, columns=header) wb.close()
补充说明
浮点数精度问题源于计算机二进制存储的局限性,Excel里显示的数值是格式化后的结果,底层存储的可能是近似值。上述方法要么读取底层值并转为高精度的Decimal类型,要么直接读取界面显示的文本,都能解决你的问题。
内容的提问来源于stack exchange,提问作者Allison
相关产品推荐
相关产品推荐

