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

xlwings读取DRM保护Excel转DataFrame时hh:mm:ss.000时间解析异常

问题成因
  • Excel底层用浮点序列值存储日期时间类数据:整数部分为距基准日期1899-12-30的累计天数,小数部分为当前时间占全天24小时的比例,例如正午12:00对应存储值为0.5。
  • 读取得到的0.340030类数值不属于转换错误,是单元格的原始存储值。该现象的触发逻辑:pd.read_excel 调用的openpyxl、xlrd等引擎会自动识别单元格数字格式,将标记为时间格式的浮点值自动映射为时间类型;但xlwings通过COM接口读取DRM保护文件时,开启chunksize大文件分块读取参数后,会跳过单元格格式识别步骤,直接返回底层存储的浮点值,未做时间类型自动转换。
  • 给出的0.34左右浮点值经换算对应8点9-10分区间的时间,与原表hh:mm:ss.000毫秒级时间的存储逻辑完全匹配。
修复方案

优先使用手动类型转换方案,兼容性最强,打包为exe后不会出现依赖缺失、格式识别失效问题:

  1. 保留原有读取逻辑,读取完成后对时间列做显式类型转换,代码如下:
# 将time_col替换为表格中时间列的实际列名
time_col = "记录时间"

# 纯时间列优先选此方案:转为timedelta时间差类型,仅保留时分秒毫秒信息,无冗余日期字段
ref_sheet[time_col] = pd.to_timedelta(ref_sheet[time_col] * pd.Timedelta(days=1))

# 需要datetime64日期时间类型时启用此方案:自动补上Excel默认基准日期1899-12-30作为日期部分
# ref_sheet[time_col] = pd.Timestamp("1899-12-30") + pd.to_timedelta(ref_sheet[time_col], unit="d")
  1. 转换后可通过格式化输出验证精度,输出格式与原表hh:mm:ss.000完全一致:
print(ref_sheet[time_col].dt.strftime("%H:%M:%S.%f").str[:-3])
  1. 若文件体积较小无需分块读取,可移除chunksize=10000参数,xlwings默认格式识别逻辑会自动将时间格式单元格转为datetime类型,无需额外转换;但大文件场景下读取速度会显著下降,不推荐使用。
注意事项
  • 类型转换完成前,不要直接对浮点形式的时间值做计算,浮点精度误差会导致时间计算结果偏差。
  • 存在多列时间格式数据时,批量遍历目标列执行上述转换逻辑即可,无需逐列单独处理。

内容的提问来源于stack exchange,提问作者jw jjang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 22:42:29