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

如何将Pandas的季度重采样求和代码改写为Polars实现?

Pandas季度重采样求和转Polars实现的问题解决

需求背景

要将Pandas代码ts = aux.set_index(date_col, drop=True).resample("Q").sum()改写为Polars实现,用户尝试了以下代码(aux为LazyFrame):

ts = aux.select(pl.all().sort_by(date_col)).set_sorted(date_col).collect().upsample(time_column=date_col, every="3mo")

报错信息(翻译后)

线程 panicked at 'called Result::unwrap() on an Err value: ComputeError(ErrString("无法将'2021-08-31 00:00:00'往后推进3个月。如果你想获取每月最后一天,可以尝试使用.dt.month_end"))', /Users/runner/work/polars/polars/polars/polars-time/src/upsample.rs:120:83

问题分析

  1. 原代码未实现求和逻辑:upsample仅用于补全时间序列的缺失日期,不会对数据做聚合求和,和Pandas的resample.sum()功能不符。
  2. 日期推进逻辑冲突:使用every="3mo"时,Polars会按自然月天数推进日期,8月31日加3个月会得到不存在的11月31日,导致报错。而Pandas的resample("Q")是按日历季度(如Q3为7-9月,结束于9月30日)对齐,自动处理有效季度末日期。

正确Polars实现

方法1:直接使用resample(Polars 0.19+推荐)

Polars已支持resample方法,语法和Pandas接近,直接实现季度求和:

ts = aux.resample(date_col, every="Q").sum().collect()

方法2:使用groupby_dynamic(更灵活)

如果需要自定义季度的闭合/标签规则,用groupby_dynamic实现:

ts = (
    aux
    .set_sorted(date_col)  # 标记日期列已排序,优化性能
    .groupby_dynamic(
        date_col,
        every="Q",          # 按季度分组
        closed="right",     # 季度区间为左开右闭,和Pandas默认一致
        label="right"       # 用季度最后一天作为分组标签
    )
    .sum()
    .collect()
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:58:24