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

Rust Polars中用年份列表过滤Datetime列时is_in报错问题

Rust Polars中is_in方法编译错误原因解析

问题场景

在使用Rust Polars处理DataFrame时,需根据给定年份列表过滤Datetime类型的time列,尝试通过is_in方法实现时触发编译错误,提示Expr枚举无is_in方法。

你的代码示例

use polars::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let df = df!(
        "time" => ["2021-01-01", "2022-02-02", "2023-03-03", "2024-04-04"]
    )?
    .with_column(col("time").str().str_to_date(Default::default())?)?;

    let target_years = vec![2022, 2023];
    // 触发错误的写法
    let filtered_df = df.filter(col("time").dt().year().is_in(target_years))?;

    println!("{:?}", filtered_df);
    Ok(())
}

编译错误信息

error[E0599]: no method named `is_in` found for enum `polars::prelude::Expr` in the current scope
 --> src/main.rs:12:43
  |
12 |     let filtered_df = df.filter(col("time").dt().year().is_in(target_years))?;
  |                                               ^^^^^^ method not found in `Expr`

报错核心原因

Polars Rust API的设计中,is_in并非Expr枚举的直接方法,而是需要通过两种方式构造过滤表达式:

  1. 调用Expr的is_in方法,但该方法要求传入&Series类型参数,而非直接传入Vec;
  2. 使用顶层的polars::prelude::is_in函数,接收表达式和可转换为Series的集合类型。

你遇到错误的核心原因有两点:

  • 错误地在Expr(col("time").dt().year()返回值为Expr)上直接调用is_in,但该方法并不存在于Expr的方法集中;
  • 直接传递Vec<i32>作为参数,不符合is_in方法/函数的参数类型要求。

正确实现方式

Claude提供的可行代码本质是遵循了Polars表达式系统的规则,以下是简化后的正确写法:

方式1:使用Expr的is_in方法(传入Series)

use polars::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let df = df!(
        "time" => ["2021-01-01", "2022-02-02", "2023-03-03", "2024-04-04"]
    )?
    .with_column(col("time").str().str_to_date(Default::default())?)?;

    let target_years = Series::new("years", vec![2022, 2023]);
    let filtered_df = df.filter(col("time").dt().year().is_in(&target_years))?;

    println!("{:?}", filtered_df);
    Ok(())
}

方式2:使用顶层is_in函数

use polars::prelude::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let df = df!(
        "time" => ["2021-01-01", "2022-02-02", "2023-03-03", "2024-04-04"]
    )?
    .with_column(col("time").str().str_to_date(Default::default())?)?;

    let target_years = vec![2022, 2023];
    let filtered_df = df.filter(is_in(col("time").dt().year(), target_years))?;

    println!("{:?}", filtered_df);
    Ok(())
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:57:19