我想按每小时/每天/每周的间隔对数据进行分组,并进一步按某些其他条款进行分组。通过使用 Polars 提供的 group_by_dynamic 选项,我能够实现每小时/每天/每周分组。
在 Polars 中使用 groupby_dynamic 操作后,如何向 Polars 数据帧添加辅助非日期时间 group_by 子句?
从 csv 读取的示例数据帧是
df = pl.from_repr("""
┌─────────────────────┬──────────┬────────┬─────────┬──────────┐
│ Date ┆ Item ┆ Issue ┆ Channel ┆ ID │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ datetime[μs] ┆ str ┆ str ┆ str ┆ i64 │
╞═════════════════════╪══════════╪════════╪═════════╪══════════╡
│ 2023-01-02 01:40:00 ┆ Item ABC ┆ ASDFFF ┆ Web ┆ 32513995 │
│ 2023-01-02 02:15:00 ┆ Item ABC ┆ WERWET ┆ Web ┆ 32513995 │
│ 2023-01-02 03:00:00 ┆ Item ABC ┆ BVRTNB ┆ Twitter ┆ 32513995 │
│ 2023-01-03 04:11:00 ┆ Item ABC ┆ VDFGVS ┆ Fax ┆ 32513995 │
│ 2023-01-03 04:30:00 ┆ Item ABC ┆ QWEDWE ┆ Twitter ┆ 32513995 │
│ 2023-01-03 04:45:00 ┆ Item ABC ┆ BRHMNU ┆ Fax ┆ 32513995 │
└─────────────────────┴──────────┴────────┴─────────┴──────────┘
""")
我使用以下代码片段使用极坐标 group_by_dynamic 操作按小时间隔对这些数据进行分组。
import polars as pl
q = (
pl.scan_csv("Test.csv", try_parse_dates=True)
.filter(pl.col("Item") == "Item ABC")
.group_by_dynamic("Date", every="1h", closed="right")
.agg(pl.col("ID").count().alias("total"))
.sort("Date")
)
df = q.collect()
这段代码给我的结果是
┌─────────────────────┬───────┐
│ Date ┆ total │
╞═════════════════════╪═══════╡
│ 2023-01-02 01:00:00 ┆ 2 │
│ 2023-01-02 02:00:00 ┆ 1 │
│ 2023-01-02 03:00:00 ┆ 1 │
│ 2023-01-05 04:00:00 ┆ 3 │
└─────────────────────┴───────┘
但是我想按“通道”进一步对这些数据进行分组,并期望结果为
┌────────────-──────-─┬─────────┬───────┐
│ Date ┆ Channel ┆ total │
╞═════════════════════╪═════════╪═══════╡
│ 2023-01-02 01:00:00 ┆ Twitter ┆ 1 │
│ 2023-01-02 01:00:00 ┆ Web ┆ 1 │
│ 2023-01-02 01:00:00 ┆ Web ┆ 1 │
│ 2023-01-02 01:00:00 ┆ Twitter ┆ 1 │
│ 2023-01-03 01:00:00 ┆ Fax ┆ 2 │
│ 2023-01-11 01:00:00 ┆ Twitter ┆ 1 │
└─────────────────────┴─────────┴───────┘
group_by
q = (
pl.scan_csv("Test.csv", try_parse_dates=True)
.filter(pl.col("Item") == "Item ABC")
.group_by_dynamic("Date", every="1h", closed="right", group_by="Item")
.agg(pl.col("ID").count().alias("total"))
.sort("Date")
)