Polars read_excel读取Excel日期年份截断致混淆问题求助
解决Polars读取Excel日期时两位数年份混淆问题
问题核心
使用Polars的read_excel读取Excel时,"mm-dd-yy"格式的日期字符串会被默认解析为20xx年(比如'01-01-50'被识别为2050年1月1日),导致1950年和2050年的日期无法区分。
解决方案
方案一:读取后转换日期,指定两位数年份阈值
先将日期列读取为字符串,再用str.to_date方法解析,通过year2000参数设置年份映射规则——让50及以上的两位数年份对应19xx,00-49对应20xx:
import polars as pl # 读取时将目标日期列设为字符串类型 df = pl.read_excel('file_name.xlsx', dtype={'你的日期列名': str}) # 转换为日期格式,设置year2000参数指定阈值 df = df.with_columns( pl.col('你的日期列名').str.to_date(format="%m-%d-%y", year2000=1950).alias('修正后的日期') ) print(df)
方案二:手动解析日期(灵活处理混合格式)
如果Excel中存在多种日期格式,可通过openpyxl先读取数据,自定义函数处理年份:
import polars as pl from openpyxl import load_workbook from datetime import datetime # 加载Excel文件 wb = load_workbook('file_name.xlsx', data_only=True) ws = wb.active # 自定义日期解析函数:将2050及以上的年份减100转为19xx def fix_date(cell_value): if isinstance(cell_value, datetime): return cell_value elif isinstance(cell_value, str): dt = datetime.strptime(cell_value, "%m-%d-%y") if dt.year >= 2050: return dt.replace(year=dt.year - 100) return dt return cell_value # 读取并处理所有行 headers = [cell.value for cell in ws[1]] processed_rows = [] for row in ws.iter_rows(min_row=2, values_only=True): processed_rows.append([fix_date(cell) for cell in row]) # 转为Polars DataFrame df = pl.DataFrame(processed_rows, schema=headers) print(df)
说明
- 方案一适合日期列统一为"mm-dd-yy"文本格式的场景,代码简洁高效;
- 方案二适合Excel中存在多种日期格式(如混合真实日期类型和文本格式)的场景,灵活性更高。
内容的提问来源于stack exchange,提问作者Jeb
相关产品推荐
相关产品推荐

