为何用Pandas读取XLSB文件时日期变为奇怪数字?
为什么Pandas读取XLSB文件时日期变成了奇怪的数字?
那些数字是Excel的日期序列号——Excel默认采用1900日期系统,把日期存储为从1900年1月1日起算的天数:
- 44927 = 2023年1月1日(1900-01-01到2023-01-01的总天数)
- 45178 = 2023年9月9日
出现这个问题的核心原因:
XLSB是二进制Excel格式,Pandas的pd.read_excel默认不会自动识别转换这类日期序列号;再加上你的列中存在非日期值(-),Pandas会将整个列判定为object类型,直接保留Excel的原始存储值。
解决方法
方法1:自动解析日期并处理缺失值
用parse_dates指定要解析的列,同时通过na_values把-标记为缺失值,让列能被正确转为日期类型:
from pathlib import WindowsPath import pandas as pd p = WindowsPath(r'C:\Users\data\book.xlsb') df = pd.read_excel(p, parse_dates=['ird'], na_values=['-']) print(df) print(df.dtypes)
执行结果:
ird 0 2023-01-01 1 2023-09-09 2 NaT ird datetime64[ns] dtype: object
方法2:自定义转换保留原始特殊值
如果需要保留-而不是转为缺失值,可以用converters自定义转换逻辑:
from pathlib import WindowsPath import pandas as pd from datetime import datetime def convert_excel_serial(val): if val == '-': return val try: # 修正Excel 1900日期系统的闰年bug,用1899-12-30作为起始偏移 return datetime(1899, 12, 30) + pd.Timedelta(days=val) except: return val p = WindowsPath(r'C:\Users\data\book.xlsb') df = pd.read_excel(p, converters={'ird': convert_excel_serial}) print(df) print(df.dtypes)
内容的提问来源于stack exchange,提问作者moth
相关产品推荐
相关产品推荐

