如何将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 anErrvalue: 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
问题分析
- 原代码未实现求和逻辑:
upsample仅用于补全时间序列的缺失日期,不会对数据做聚合求和,和Pandas的resample.sum()功能不符。 - 日期推进逻辑冲突:使用
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
相关产品推荐
相关产品推荐

