Python中Pandas读取.xlsb文件日期列转为int64的问题求助
解决Pandas读取xlsb文件时日期列转为整数的问题
问题场景
使用Pandas结合pyxlsb引擎读取.xlsb文件时,日期列被识别为int64类型的五位整数,而非实际日期格式。手动将工作表另存为.xlsx虽能正常读取日期,但批量处理效率极低。需求是将该列转为datetime或字符串类型,无需保留整数形式。
用户当前代码:
# Import Libraries from pdb import pm import pandas as pd import pyxlsb from sqlalchemy import create_engine import urllib import pyodbc # Read Excel File df = pd.read_excel(r'\\filepath\filename.xlsb', sheet_name='my_sheet', index_col=0, engine='pyxlsb') df['Date']
执行后Date列输出:
| Date |
|---|
| 45291 |
| 44561 |
| 44561 |
| 43830 |
| 44196 |
执行df['Date'].dtype返回:
dtype('int64')
另存为.xlsx后读取的实际日期示例:
12/31/2023 1 12/31/2021 2 12/31/2021 3 12/31/2019 4 12/31/2020 ... 405 08/31/2023 406 09/30/2023 407 09/30/2023 408 08/31/2023 409 12/31/2023
解决方案
方法1:读取后快速转换为datetime/字符串类型
利用Pandas的to_datetime函数,结合Excel日期的起始基准(1899-12-30)完成转换:
# 将整数转为datetime类型 df['Date'] = pd.to_datetime(df['Date'], unit='D', origin='1899-12-30') # 若需要转为指定格式的字符串(如MM/DD/YYYY) df['Date'] = df['Date'].dt.strftime('%m/%d/%Y')
方法2:读取时直接解析日期(pyxlsb原生处理)
如果需要更精准的读取控制,可使用pyxlsb原生API读取单元格的日期属性:
from pyxlsb import open_workbook with open_workbook(r'\\filepath\filename.xlsb') as wb: with wb.get_sheet('my_sheet') as sheet: # 读取表头 header = [cell.v for cell in next(sheet.rows)] data_rows = [] # 遍历数据行 for row in sheet.rows: # 假设Date列是第2列(对应原index_col=0后的第一列) raw_date = row[1].v # 转换为datetime converted_date = pd.to_datetime(raw_date, unit='D', origin='1899-12-30') # 收集整行数据 data_rows.append([row[0].v, converted_date] + [cell.v for cell in row[2:]]) # 转为DataFrame df = pd.DataFrame(data_rows, columns=header)
验证转换结果
转换后可通过以下代码确认结果:
# 查看列类型 print(df['Date'].dtype) # 查看转换后的数据 print(df['Date'])
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

