Polars中如何为日期列增加指定年数并实现分组统计
报错原因
Polars 表达式运算无法直接识别Python侧的dateutil.relativedelta对象,所以会抛出字面量类型错误。Polars本身内置了高性能的日期偏移API,不需要依赖第三方日期处理库,完全可以在表达式内部直接完成年数偏移计算。
推荐实现方案
使用Polars原生的dt.offset_by()方法做日期偏移,传入"3y"即可实现日期加3年的逻辑,该方法会自动处理闰年、月末日期对齐等特殊场景,计算逻辑比手动加天数、转Python datetime对象计算更准确,且所有计算都在Polars内核完成,性能远高于Python侧循环处理,完全适配LazyFrame场景。
修正后的代码如下:
import polars as pl # 省略df初始化步骤,直接写分组统计逻辑 result = df.group_by("cited_patent").agg( pl.col("cited_patent_issue_date").first(), # 统计3年内引用量:引用日期 <= 被引专利公开日+3年 (pl.col("citing_patent_issue_date") <= pl.col("cited_patent_issue_date").first().dt.offset_by("3y")) .sum() .alias("3y_citation_count") )
针对你提供的样例数据,运行后输出结果为:
shape: (2, 3) ┌──────────────┬─────────────────────────┬──────────────────┐ │ cited_patent ┆ cited_patent_issue_date ┆ 3y_citation_count│ │ str ┆ date ┆ u32 │ ╞══════════════╪═════════════════════════╪══════════════════╡ │ A ┆ 2000-10-20 ┆ 1 │ │ B ┆ 1999-08-04 ┆ 1 │ └──────────────┴─────────────────────────┴──────────────────┘
补充说明
- 如果你使用的Polars版本较低(<0.19),没有
dt.offset_by()方法,可以替换为dt.add_years(3)实现完全相同的年偏移效果,写法为pl.col("cited_patent_issue_date").first().dt.add_years(3) - 如果需要严格限定引用发生在专利公开之后,可以在判断条件中补充
pl.col("citing_patent_issue_date") >= pl.col("cited_patent_issue_date").first(),两个判断条件用&连接即可,注意每个条件要单独加括号。
内容的提问来源于stack exchange,提问作者seasonedfish
相关产品推荐
相关产品推荐

