You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Polars如何实现每日重置的滚动求和?

实现Polars按自然日重置的累计求和

你当前用Polars的rolling窗口实现的是滑动24小时窗口求和,跨日期时会包含前一天的数据,不符合按自然日重置的需求。要实现和Pandas中groupby(pd.Grouper(freq='D'))[col].transform('cumsum')等价的逻辑,在Polars里可以通过按自然日分组后计算累计和来实现。

修正后的代码

from datetime import datetime, timedelta
import polars as pl

df = pl.DataFrame({
    "date": pl.datetime_range(
        datetime(1985, 1, 1),
        datetime(1985, 1, 6),
        timedelta(minutes=5),
        time_unit="ns",
        eager=True
    )
})

df = df.with_columns(A=pl.lit(2, dtype=pl.Int32))

# 核心逻辑:按日期(自然日)分组,对A列计算累计和
df = df.with_columns(
    A_daily=pl.col("A").cumsum().over(pl.col("date").dt.date())
)

print(df[280:])

关键说明

  • pl.col("date").dt.date():提取datetime字段的日期部分,作为分组依据,确保每个自然日为独立分组
  • pl.col("A").cumsum().over(...):Polars的over子句实现分组内的窗口计算,等价于Pandas的groupby.transform('cumsum'),对每个分组内的A列计算累计求和,自动在分组边界重置计算

输出验证

修正后输出会符合你的预期:

shape: (1_161, 3)
┌─────────────────────┬─────┬─────────┐
│ date                ┆ A   ┆ A_daily │
│ ---                 ┆ --- ┆ ---     │
│ datetime[ns]        ┆ i32 ┆ i32     │
╞═════════════════════╪═════╪═════════╡
│ 1985-01-01 23:20:00 ┆ 2   ┆ 562     │
│ 1985-01-01 23:25:00 ┆ 2   ┆ 564     │
...
│ 1985-01-01 23:55:00 ┆ 2   ┆ 576     │
│ 1985-01-02 00:00:00 ┆ 2   ┆ 2       │
│ 1985-01-02 00:05:00 ┆ 2   ┆ 4       │
│ 1985-01-02 00:10:00 ┆ 2   ┆ 6       │
...

内容的提问来源于stack exchange,提问作者Deftness

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:02:03