Polars中如何对日期列执行加1年的运算操作
如何在Polars中为日期列增加1年
直接使用Polars日期时间命名空间内置的dt.offset_by()方法即可,不需要手动拼接年月日,也不需要写多分支判断,该方法原生支持各类日期间隔偏移,自动处理闰年、月末等边界场景,不会触发日期越界报错。
最简实现代码如下:
import polars as pl # 构造示例数据 df = pl.DataFrame({ "date": ["2020-02-29", "2023-01-15", "2024-12-31", None] }).with_columns(pl.col("date").str.to_date()) # 为日期列统一加1年 df = df.with_columns( pl.col("date").dt.offset_by("1y").alias("date_add_1y") )
相关问题说明
- 手动拼接
pl.date(col.year()+1, col.month(), col.day())报错的原因:遇到闰年2月29日这类特殊日期时,下一年不存在对应月日,会直接触发底层chrono库的日期越界panic,和你贴出的报错信息完全匹配。你写的逐月份判断逻辑不仅代码冗余,同样无法处理月末、闰年的边界情况,比如1月31日偏移1个月到2月时,不存在31日就会触发同类报错。 map/apply实现失败的原因:这两个方法是按行调用Python自定义函数,性能比Polars原生表达式低1~2个数量级,且类型推导极易出错,官方本身就不推荐用这两个方法做常规列运算。- 关于
pl.date()支持传入整数的疑问:文档标注参数仅接受str或Expr类型,是因为传入整数时Polars会自动将其包装为字面量表达式pl.lit(整数),属于内置的语法糖,不是参数类型不符合预期。
其他偏移场景扩展
dt.offset_by()支持灵活的间隔参数,可覆盖绝大多数日期偏移需求,默认会自动将无效日期对齐到对应月份的最后一个有效日:
- 偏移1年零3个月:
pl.col("date").dt.offset_by("1y3mo") - 偏移-6个月(即往前推6个月):
pl.col("date").dt.offset_by("-6mo") - 偏移1年零10天:
pl.col("date").dt.offset_by("1y10d")
内容的提问来源于stack exchange,提问作者supersick
相关产品推荐
相关产品推荐

