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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 02:45:12