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枚举的直接方法,而是需要通过两种方式构造过滤表达式:
- 调用
Expr的is_in方法,但该方法要求传入&Series类型参数,而非直接传入Vec; - 使用顶层的
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
相关产品推荐
相关产品推荐

