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

如何在Polars中按时间戳及其他列分组计算年度平均人口?

解决方案:Polars实现分省份的年度人口平均

针对你的需求,分两种常见场景给出具体实现,先明确术语:

  • 如果是自然年度的固定平均(比如2022年、2023年各省份的全年平均),不需要滚动窗口;
  • 如果是滚动1年的移动平均(每个时间点往前12个月的平均),才用groupby_rolling,这也是你提到的滚动窗口的正确用法。

场景1:按自然年度计算各省份年度平均人口

方法1:提取年份后分组聚合

先从timestamp中提取年份字段,再按「国家-省份-年份」分组计算平均:

# 新增年份列
df = df.with_columns(year=pl.col("timestamp").dt.year())

# 分组计算年度平均人口
annual_avg_pop = df.groupby(["country", "province", "year"]).agg(
    pl.col("population").mean().alias("annual_avg_population")
)

方法2:用groupby_dynamic按年度动态分组

Polars的groupby_dynamic可以自动按时间周期切分,适合时间序列数据:

annual_avg_pop = df.groupby_dynamic(
    index="timestamp",
    every="1y",  # 按每年一个周期分组
    group_by=["country", "province"],  # 同时按国家、省份分组
).agg(
    pl.col("population").mean().alias("annual_avg_population")
)

这种方式会自动将时间轴按年度划分,每个分组对应一个国家-省份的全年数据。


场景2:滚动1年窗口的移动平均人口

如果需要计算每个时间点往前1年窗口内的人口平均值(随时间滑动的年度平均),用groupby_rolling结合分组键即可:

rolling_1y_avg_pop = df.groupby_rolling(
    index="timestamp",
    period="1y",  # 窗口覆盖过去1年
    group_by=["country", "province"],  # 分国家-省份计算
).agg(
    pl.col("population").mean().alias("rolling_1y_avg_population")
)

这个代码会为每个时间点生成对应窗口内的平均人口,完全满足你「随时间变化的年度平均」需求。


注意事项

你的原代码里用了列名prov,但描述中是province,实际使用时要保证列名一致,避免报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:48:14