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
相关产品推荐
相关产品推荐

