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

如何在Polars Rust中按日期列的年份或星期几分组?

按日期年份分组DataFrame的问题

我正尝试按日期列的年份对DataFrame进行分组,先创建了如下DataFrame:

let s0 = Series::new("date", &["2021-01-14","2022-04-09","2021-06-24","2022-12-04","2022-11-25"]);
let s1 = Series::new("values", &[1, 2, 3, 4, 5]);
let mut df = DataFrame::new(vec![s0, s1])?;
df.try_apply("date", |col_series| {Ok(col_series.utf8().unwrap().as_date(Some("%Y-%m-%d")).unwrap().into_series())});
let lf = df.lazy();

下面是我尝试实现但无法正常运行的代码:

lf.groupby([col("date").year()]).agg([col("values").sum()]).collect()

解决方案

问题根源有两点:一是try_apply的结果没有赋值回原DataFrame,导致date列仍为字符串类型;二是惰性API中访问日期方法需要通过.dt()前缀。

修正后的完整代码:

use polars::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let s0 = Series::new("date", &["2021-01-14","2022-04-09","2021-06-24","2022-12-04","2022-11-25"]);
    let s1 = Series::new("values", &[1, 2, 3, 4, 5]);
    let mut df = DataFrame::new(vec![s0, s1])?;
    
    // 转换日期列并更新DataFrame
    df = df.try_apply("date", |col_series| {
        Ok(col_series.utf8()?.as_date(Some("%Y-%m-%d"))?.into_series())
    })?;
    
    let lf = df.lazy();
    // 按年份分组并计算values列的和
    let result = lf.groupby([col("date").dt().year()])
        .agg([col("values").sum()])
        .collect()?;
    
    println!("{}", result);
    Ok(())
}

关键说明

  • try_apply会返回转换后的新DataFrame,必须重新赋值给df,否则原列类型不会改变
  • 惰性模式下,日期类型列的相关方法需要通过.dt()调用,所以使用col("date").dt().year()来提取年份
  • 代码中用?替代unwrap(),更规范地处理可能的错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:54:23