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

