使用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
相关产品推荐
相关产品推荐

