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

Polars 1.0.0中group_by_dynamic后len()懒模式可用但急模式报错

Polars 1.0.0:group_by_dynamic在懒/急模式下的len()方法差异

在Polars 1.0.0版本中,存在一个反常的API行为:对group_by_dynamic()的结果调用len()方法时,懒模式可以正常运行,但急模式会触发报错。

代码示例验证

懒模式(正常执行)

from datetime import datetime
import polars as pl

df = pl.DataFrame(
    {
        "time": pl.datetime_range(
            start=datetime(2024, 6, 30),
            end=datetime(2024, 7, 16),
            interval="1d",
            eager=True,
        ),
    }
).with_columns(n=pl.int_range(pl.len()))

# 懒模式下调用len():正常输出
x = df.lazy().group_by_dynamic("time", every="1w").len(name="count").collect()
print(x)
# 输出结果:
# shape: (4, 2)
# ┌─────────────────────┬───────┐
# │ time                ┆ count │
# │ ---                 ┆ ---   │
# │ datetime[μs]        ┆ u32   │
# ╞═════════════════════╪═══════╡
# │ 2024-06-24 00:00:00 ┆ 1     │
# │ 2024-07-01 00:00:00 ┆ 7     │
# │ 2024-07-08 00:00:00 ┆ 7     │
# │ 2024-07-15 00:00:00 ┆ 2     │
# └─────────────────────┴───────┘

急模式(触发报错)

# 急模式下调用len():报错
x = df.group_by_dynamic("time", every="1w").len(name="count")
print(x)
# 报错信息:
# Traceback (most recent call last):
#   File "/Users/anto/src/poste/sda-poste-logistics/script/polars_bug_groupby_dynamic_len.py", line 26, in <module>
#     x = df.group_by_dynamic("time", every="1w").len(name="count")
#         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# AttributeError: 'DynamicGroupBy' object has no attribute 'len'

差异原因

这种不一致是Polars API设计的不对称性导致的:

  • 懒模式返回的LazyGroupByDynamic类封装了len()快捷方法,用于快速实现分组计数;
  • 而急模式返回的DynamicGroupBy类并未提供这个快捷方法,必须通过标准的聚合语法来实现相同功能。

这类问题属于API一致性缺陷,后续版本大概率会修复,让急模式也支持直接调用len()。

急模式下的替代实现

如果需要在急模式下完成相同的分组计数,只能通过agg()方法配合pl.len()实现:

# 急模式下的正确写法
x = df.group_by_dynamic("time", every="1w").agg(counts=pl.len())
print(x)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:33:12