如何修改pd.read_excel读取浮点值,保留两位小数并同步至数据库?
读取Excel浮点值时小数位丢失问题
问题详情
- Excel文件中的原始数值:
- 7257.5679
- 6942.0949714286
- 5780.0125476250005
- 当前使用的
read_excel代码:DataFrame = pd.read_excel(File_Name, names=['id', 'value'], dtype={'id': str, 'value': float}) - Pandas当前输出结果:
- 7258
- 6942
- 5780
- 数据库中实际存储的数值(FLOAT列):
- 7257.5679
- 6942.0949714286
- 5780.0125476250005
- 期望得到的结果(Pandas及数据库中):
- 7258.56
- 6942.09
- 5780.01
注:期望结果中第一个数值7258.56与原始值7257.5679不符,推测为笔误,以下方案默认按四舍五入保留两位小数处理,若需特殊逻辑可调整。
解决方法
方案1:读取后统一处理小数位
先让Pandas自动识别Excel中的数值类型(避免强制指定dtype=float可能导致的精度截断),再用round()方法保留两位小数:
import pandas as pd # 读取文件,仅指定id的类型为字符串 df = pd.read_excel(File_Name, names=['id', 'value'], dtype={'id': str}) # 对value列四舍五入保留两位小数 df['value'] = df['value'].round(2)
方案2:读取时通过转换器实时处理
使用read_excel的converters参数,在读取阶段直接对value列做小数位处理:
import pandas as pd def process_value(x): # 将读取到的数值转为float后四舍五入保留两位小数 return round(float(x), 2) df = pd.read_excel( File_Name, names=['id', 'value'], dtype={'id': str}, converters={'value': process_value} )
特殊需求:截断小数位而非四舍五入
如果需要直接截断两位小数(比如7257.5679变为7257.56,而非四舍五入的7257.57),可以修改处理函数:
import pandas as pd import math def truncate_value(x): num = float(x) # 乘以100后取整再除以100,实现截断两位小数 return math.floor(num * 100) / 100 df = pd.read_excel( File_Name, names=['id', 'value'], dtype={'id': str}, converters={'value': truncate_value} )
数据库存储说明
处理后的数值直接写入数据库FLOAT列即可,数据库会按处理后的两位小数存储,符合你的期望结果。
内容的提问来源于stack exchange,提问作者Angel's Tear
相关产品推荐
相关产品推荐

