我有一个Polars LazyFrame,在应用了几个函数之后,看起来像这样:
┌───────────────┬──────────────┬─────────────────────────┬──────────────────────────┐
│ citing_patent ┆ cited_patent ┆ cited_patent_issue_date ┆ citing_patent_issue_date │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ str ┆ date ┆ date │
╞═══════════════╪══════════════╪═════════════════════════╪══════════════════════════╡
│ X ┆ A ┆ 2000-10-20 ┆ 2001-02-08 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ X ┆ B ┆ 1999-08-04 ┆ 2001-02-08 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ Y ┆ B ┆ 1999-08-04 ┆ 2004-06-04 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ N ┆ A ┆ 2000-10-20 ┆ 2021-12-20 │
└───────────────┴──────────────┴─────────────────────────┴──────────────────────────┘
我想将其按cited_patent
分组,并在cited_patent_issue_date
的三年内有一列citing_patent
的数量。
在阅读了15741618之后,我尝试使用dateutil.relativedelta
。
这是我到目前为止的代码:
.groupby("cited_patent")
.agg(
[
pl.col("cited_patent_issue_date").first(),
(pl.col("citing_patent_issue_date") <= pl.col("cited_patent_issue_date").first() + relativedelta(years=3)).sum()
]
)
但是,这不起作用,因为我得到一个错误:
pyo3_runtime.PanicException: could not convert value relativedelta(years=+3) as a Literal
我似乎找不到关于这个的任何其他内容,所以我有点卡住了。
在极地日期中添加年份的推荐方法是什么?
可以使用offset_by
函数。从这些数据开始:
import polars as pl
df = pl.DataFrame(
{
"citing_patent": ["X", "X", "Y", "N"],
"cited_patent": ["A", "B", "B", "A"],
"cited_patent_issue_date": [
"2000-10-20",
"1999-08-04",
"1999-08-04",
"2000-10-20",
],
"citing_patent_issue_date": [
"2001-02-08",
"2001-02-08",
"2004-06-04",
"2021-12-20",
],
}
).with_columns(pl.col("^.*_date$").str.strptime(pl.Date))
df
shape: (4, 4)
┌───────────────┬──────────────┬─────────────────────────┬──────────────────────────┐
│ citing_patent ┆ cited_patent ┆ cited_patent_issue_date ┆ citing_patent_issue_date │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ str ┆ date ┆ date │
╞═══════════════╪══════════════╪═════════════════════════╪══════════════════════════╡
│ X ┆ A ┆ 2000-10-20 ┆ 2001-02-08 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ X ┆ B ┆ 1999-08-04 ┆ 2001-02-08 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ Y ┆ B ┆ 1999-08-04 ┆ 2004-06-04 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ N ┆ A ┆ 2000-10-20 ┆ 2021-12-20 │
└───────────────┴──────────────┴─────────────────────────┴──────────────────────────┘
我们可以使用offset_by
和3y
。请注意,它位于polar中datetime表达式的dt
命名空间下。
(
df.groupby("cited_patent").agg(
[
pl.col("cited_patent_issue_date").first(),
(
pl.col("citing_patent_issue_date")
<= pl.col("cited_patent_issue_date").first().dt.offset_by('3y')
).sum(),
]
)
)
shape: (2, 3)
┌──────────────┬─────────────────────────┬──────────────────────────┐
│ cited_patent ┆ cited_patent_issue_date ┆ citing_patent_issue_date │
│ --- ┆ --- ┆ --- │
│ str ┆ date ┆ u32 │
╞══════════════╪═════════════════════════╪══════════════════════════╡
│ B ┆ 1999-08-04 ┆ 1 │
├╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ A ┆ 2000-10-20 ┆ 1 │
└──────────────┴─────────────────────────┴──────────────────────────┘