使用Rust Polars库拼接不同类型列生成日期列
解决方案
可以通过指定CSV Schema确保类型匹配预期,再利用Polars的表达式API将year、month、day三列拼接为date列。以下是修改后的完整代码:
use polars::prelude::*; fn read_from_file(path: &str) -> Result<DataFrame, Box<dyn std::error::Error>> { // 定义与CSV结构匹配的Schema,确保列类型准确 let schema = Schema::new(vec![ Field::new("name", DataType::String), Field::new("month", DataType::String), Field::new("day", DataType::Int64), Field::new("year", DataType::Int64), ]); let df = CsvReader::from_path(path)? .schema(&schema) // 使用指定Schema读取,替代自动推断 .has_header(true) .finish()?; // 拼接三列为date列(格式示例:年-月-日) let df_with_date = df .with_column( // 用格式化表达式拼接列,Polars自动处理数值到字符串的转换 format!("{}-{}-{}", col("year"), col("month"), col("day")) .alias("date") )?; println!("{}", df_with_date); Ok(df_with_date) } fn main() -> Result<(), Box<dyn std::error::Error>> { read_from_file("./data/test.csv")?; Ok(()) }
关键细节说明:
- 指定Schema:手动定义Schema能避免Polars自动推断类型时出现偏差,严格保证
month为字符串、day和year为i64类型。 - 格式扩展:如果需要给日/月补零(比如将
5转为05),可以结合字符串填充方法调整:format!("{}-{}-{}", col("year"), col("month").str().pad_start(2, '0'), col("day").cast(DataType::String).str().pad_start(2, '0') ).alias("date") - 精简列结构:若不需要保留原始的
month、day、year列,可通过select方法只保留需要的列:let df_simplified = df_with_date.select(&[col("name"), col("date")])?;
内容的提问来源于stack exchange,提问作者RYAN C
相关产品推荐
相关产品推荐

