如何实现Polars DataFrame按指定列分组后的时间序列升采样
Polars 分组后时间序列升采样实现方案
问题说明
需要对Polars DataFrame先按fruit列分组,再按date字段做1天粒度升采样,空缺值使用前向填充规则补全:
- 测试数据集构造代码:
import polars as pl df = pl.from_repr(""" ┌───────┬─────────────────────┬───────┐ │ fruit ┆ date ┆ count │ │ --- ┆ --- ┆ --- │ │ str ┆ datetime[ns] ┆ i64 │ ╞═══════╪═════════════════════╪═══════╡ │ apple ┆ 2022-06-01 00:00:00 ┆ 5 │ │ apple ┆ 2022-06-03 00:00:00 ┆ 6 │ │ apple ┆ 2022-06-04 00:00:00 ┆ 2 │ │ apple ┆ 2022-06-07 00:00:00 ┆ 1 │ │ pear ┆ 2022-06-01 00:00:00 ┆ 9 │ │ pear ┆ 2022-06-07 00:00:00 ┆ 12 │ └───────┴─────────────────────┴───────┘ """)
- 期望输出共14行,每个水果分组内的日期从2022-06-01到2022-06-07按天连续,空缺的
count值取前一个最近的非空值填充。 - 无分组场景下全局升采样可直接使用
df.upsample('date', every='1d').fill_null(strategy="forward")实现,但该方法无法自动适配分组逻辑。
实现代码
Polars 0.19及以上版本原生支持分组后链式调用升采样方法,代码如下:
result = df.group_by("fruit", maintain_order=True)\ .upsample(time_column="date", every="1d")\ .fill_null(strategy="forward")
关键参数说明
maintain_order=True:保留原数据中分组的出现顺序,避免结果中分组顺序被随机重排,和预期输出顺序一致。- 分组后调用
upsample时,时间序列生成逻辑会在每个分组内部独立执行,不会跨组生成无效时间行。 - 后续的
fill_null(strategy="forward")会自动按分组边界执行前向填充,不会出现上一组末尾值填充到下一组开头的问题。
执行后得到的结果和期望输出完全匹配。
内容的提问来源于stack exchange,提问作者NFern
相关产品推荐
相关产品推荐

