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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:08:13