pandas读取xlsb时Excel日期序列号转时间戳返回1970年异常
问题原因
- 读取得到的
44710.37680是Excel标准日期序列号:整数位为距1900年基准日的天数偏移,小数位为当日时分秒的占比,不是Unix时间戳。直接调用pd.Timestamp(x)默认按Unix时间戳(从1970-01-01起算的秒/毫秒偏移)解析,必然得到1970年的错误结果。 - 读取后转存CSV再重新读入的流程属于冗余操作,可能额外引入精度丢失、类型识别偏差问题。
- 读取.xlsb二进制格式文件需要提前安装
pyxlsb依赖,否则pandas无法自动识别单元格格式,会直接返回原始序列号。
解决方案
方案1:读取阶段自动解析(优先选用)
直接在读取文件时指定日期解析参数,跳过中间转存步骤,一步拿到正确的日期类型:
import pandas as pd # 提前执行 pip install pyxlsb 安装xlsb读取依赖 df = pd.read_excel( file, sheet_name='Raw', engine='pyxlsb', parse_dates=['First LogonTime'] # 指定需要解析为日期的列 ) # 如需转成指定格式的字符串,用dt接口直接处理即可 df['First LogonTime'] = df['First LogonTime'].dt.strftime('%Y-%m-%d %H:%M:%S') print(df)
方案2:已读取到序列号的手动转换
如果已经完成文件读取、拿到了浮点型的日期序列号,用pandas的日期转换接口指定正确的单位和基准点即可:
df['First LogonTime'] = pd.to_datetime( df['First LogonTime'], unit='D', # 序列号单位为天 origin='1899-12-30' # 修正Excel 1900闰年bug的基准偏移 ).dt.strftime('%Y-%m-%d %H:%M:%S')
验证:对数值
44710.37680执行上述转换,输出为2022-05-29 09:02:35,和预期的5/29/2022 9:02:36仅存在浮点计算带来的1秒级误差,属于正常范围。
内容的提问来源于stack exchange,提问作者Eestrada
相关产品推荐
相关产品推荐

