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

pandas读取xlsb文件时datetime列显示46090.0如何按原格式读取

pandas读取xlsb格式文件日期时间列的转换方法

你遇到的46090.0类浮点数是Excel内部存储的日期时间序列值:整数部分为自基准日期起的天数,小数部分为当前时间占全天的比例。可按以下步骤处理:

前置依赖

首先安装xlsb格式读取依赖:
pip install pyxlsb

方法:读取后按列规则转换(兼容性最高,适配3种不同格式的列)

第一步:读取原始文件

import pandas as pd
from pyxlsb import convert_date

# 读取文件时暂不解析日期,保留原始序列值
df = pd.read_excel("你的文件路径.xlsb", engine="pyxlsb")

第二步:分别处理三类日期时间列

假设你的三列列名分别为full_datetime、duration、ampm_time,可按对应规则转换:

  • 处理第一列「年-月-日 时:分:秒」格式的完整日期时间
# 转换为datetime类型,若要保留原始格式字符串,末尾加.dt.strftime("%Y-%m-%d %H:%M:%S")
df["full_datetime"] = df["full_datetime"].apply(lambda x: convert_date(x) if pd.notna(x) else pd.NA)

如果你的Excel是苹果端生成的1904日期体系,将转换代码改为convert_date(x, date_system=1904)即可。

  • 处理第二列「时:分:秒」格式的时长
# 转换为时分秒格式字符串,若需要保留timedelta类型可去掉后面的apply部分
df["duration"] = pd.to_timedelta(df["duration"], unit="D").dt.components.apply(
    lambda x: f"{x.hours:02d}:{x.minutes:02d}:{x.seconds:02d}", axis=1
)
  • 处理第三列「时:分:秒 上下午」格式的12小时制时间
# 转换为带am/pm的字符串,不需要小写的话去掉末尾的.str.lower()
df["ampm_time"] = df["ampm_time"].apply(lambda x: convert_date(x) if pd.notna(x) else pd.NA
                                       ).dt.strftime("%I:%M:%S %p").str.lower()

补充说明

如果不需要依赖pyxlsb的转换函数,也可以直接用pandas原生方法转换完整日期列:

df["full_datetime"] = pd.to_datetime(df["full_datetime"], unit="D", origin="1899-12-30")

这里origin设为1899-12-30是为了兼容Excel的历史闰年bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:39:03