使用Pandas读取Excel时间字段时毫秒精度不准确该如何解决
精度偏差产生原因
- Excel内部的时间、时长字段本质以浮点型存储:整数部分代表距离1900年1月1日的天数,小数部分代表当日时间占比,毫秒级的极小小数在二进制浮点存储规则下存在固有精度损失。
- pandas默认读取Excel时间字段时,自动转换逻辑会采用默认舍入规则,且对400米用时这类时长类非日期时间值适配度较低,进一步放大了毫秒维度的精度偏差。
解决方法
方法1:读取时禁用自动类型转换,手动转换为时间间隔类型
强制该列以原始格式读取,再通过pandas内置的时间间隔转换方法保留精度:
import pandas as pd excel_file_name = 'All.xlsx' df_athletes = pd.read_excel( excel_file_name, sheet_name='Athletes', dtype={'400M': object} # 强制该列不触发自动时间转换 ) # 手动转换为时间间隔类型,完整保留毫秒精度 df_athletes['400M'] = pd.to_timedelta(df_athletes['400M'].astype(str)) # 打印验证 print(df_athletes['400M'])
方法2:基于Excel原生存储规则直接计算(精度更高)
直接读取Excel存储的原始浮点值,按照Excel时间的换算规则手动转成时间间隔,完全避免转换误差:
import pandas as pd excel_file_name = 'All.xlsx' df_athletes = pd.read_excel( excel_file_name, sheet_name='Athletes', # 按Excel存储规则换算:浮点值*86400=总秒数,转时间间隔 converters={'400M': lambda x: pd.to_timedelta(x * 86400, unit='s') if pd.notna(x) else pd.NA} ) # 打印验证 print(df_athletes['400M'])
补充说明
如果仍存在偏差,可以将pandas、openpyxl依赖升级到最新版本,修复已知的时间转换类bug。
内容的提问来源于stack exchange,提问作者Vic
相关产品推荐
相关产品推荐

