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

使用pandas转换.xlsb为.xlsx时日期变为随机数字问题咨询

问题原因

你遇到的日期显示为数字的问题,本质是Excel的日期存储逻辑和读取参数不匹配导致的:

  • Excel所有日期在底层都存储为浮点型序列号:默认规则下1900年1月1日对应数值1,每过1天数值加1,当日时间以小数形式存储(例如0.5对应当日12:00)。
  • 你使用pyxlsb引擎读取xlsb文件时,没有指定日期列解析规则,pandas会直接读取底层的原始序列号值,写入xlsx时也不会自动做格式转换,最终就会显示为无意义的数字。
  • 额外提一句你贴的代码存在语法错误:文件路径字符串的单引号没有闭合,运行时会直接报语法错误,调试时需要先修正。
修复xlsb转xlsx的日期异常

两种稳定修复方案,按需选择即可:

  • 读取时自动解析日期
    在读文件时传入parse_dates参数指定所有日期列的列名,引擎会自动完成序列号到日期类型的转换,示例代码:
    import pandas as pd
    
    df = pd.read_excel(
        'excels/TEF.xlsb',  # 此处修正了原代码未闭合的引号问题
        engine='pyxlsb',
        parse_dates=['日期列1', '日期列2']  # 替换为你文件中实际的日期列名称
    )
    # 导出时加index=False避免写入多余的行索引列,路径建议用正斜杠避免Windows转义问题
    df.to_excel('./excels/TEF.xlsx', index=False)
    
  • 读取后手动转换日期列
    如果自动解析结果不符合预期,可以手动调用pandas的日期转换函数处理,注意Excel日期序列号的固定转换基准不要修改:
    import pandas as pd
    
    df = pd.read_excel('excels/TEF.xlsb', engine='pyxlsb')
    # 替换为实际日期列名,origin='1899-12-30'是兼容Excel闰年bug的固定参数,无需调整
    df['日期列名'] = pd.to_datetime(df['日期列名'], unit='D', origin='1899-12-30')
    df.to_excel('./excels/TEF.xlsx', index=False)
    

你提到的转换速度慢是正常现象:pyxlsb是纯Python实现的解析库,没有C语言加速,处理MB级以上的大文件时速度会明显低于xlsx格式的读取速度。

xlsx转xlsb的实现方案

pandas原生不支持写入xlsb格式,目前有两类成熟的实现方案:

  • 方案1:基于win32com调用本地Excel(仅Windows环境、已安装Microsoft Excel)
    这个方案的保真度最高,和手动在Excel里点「另存为xlsb」的效果完全一致,支持保留所有公式、样式、图表。首先安装依赖:
    pip install pywin32
    示例代码:
    import win32com.client as win32
    import os
    
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    excel.Visible = False  # 后台运行不弹出Excel窗口
    wb = excel.Workbooks.Open(os.path.abspath('excels/TEF.xlsx'))
    # FileFormat=50是xlsb格式的固定枚举值,无需修改
    wb.SaveAs(os.path.abspath('excels/TEF_out.xlsb'), FileFormat=50)
    wb.Close()
    excel.Quit()
    
  • 方案2:基于xlsbwriter跨平台转换(无本地Excel依赖)
    如果你用macOS/Linux,或者不想依赖本地安装的Excel,可以用xlsbwriter作为pandas的写入引擎,纯数据场景下转换效率很高。首先安装依赖:
    pip install xlsbwriter pandas openpyxl
    示例代码:
    import pandas as pd
    
    # 读取原xlsx文件
    df = pd.read_excel('excels/TEF.xlsx', engine='openpyxl')
    # 写入为xlsb格式
    with pd.ExcelWriter('excels/TEF_out.xlsb', engine='xlsbwriter') as writer:
        df.to_excel(writer, index=False, sheet_name='Sheet1')
    

注意:xlsbwriter目前对复杂Excel特性(条件格式、宏、嵌套公式、图表)的支持有限,如果你的文件带复杂格式,优先选择win32com方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:06:30