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

如何正确使用Map函数将DataType::Date转为星期字符串列

问题:将Polars中DataType::Date类型转换为星期字符串列

已实现字符串→日期类型→字符串的转换,但需要直接将DataType::Date类型数据转换为对应的星期字符串列。

解决方案

核心是针对Date类型的Series编写转换函数,利用Polars的date()方法获取日期块,再通过chrono的Datelike trait获取星期信息:

use chrono::{Datelike, NaiveDate};
use polars::prelude::*;

fn main() -> Result<()> {
    let days = df!("column_1" => &["Tuesday"],
                                "column_2" => &["1900-01-02"]).unwrap();

    let options = StrpTimeOptions {
        date_dtype: DataType::Date,
        fmt: Some("%Y-%m-%d".into()),
        strict: false,
        exact: true,
    };

    // 先将字符串列转为Date类型列 "date"
    let days_lazy = days
        .lazy()
        .with_column(col("column_2").str().strptime(options).alias("date"));

    // 定义Date转星期字符串的函数
    let output_type = GetOutput::from_type(DataType::Utf8);
    fn date_to_weekday(date_series: Series) -> Result<Series> {
        // 将Series转为DateChunked(Polars中Date类型底层是i32存储的天数偏移)
        let date_chunked = date_series.date()?;
        
        let weekday_chunked = date_chunked
            .into_iter()
            .map(|opt_date: Option<NaiveDate>| {
                opt_date.map(|date| {
                    // 直接用chrono的format方法输出星期全称,%A对应本地化星期名
                    date.format("%A").to_string()
                })
            })
            .collect::<Utf8Chunked>();
        
        Ok(weekday_chunked.into_series())
    }

    // 对Date类型列"date"应用转换函数,生成星期字符串列"weekday"
    let result = days_lazy
        .with_column(col("date").apply(date_to_weekday, output_type))
        .collect()?;

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

关键说明

  1. 处理Date类型Series:通过date_series.date()?将通用Series转为DateChunked,这是Polars处理日期类型的专用接口。
  2. 遍历日期值:DateChunked的into_iter()会返回Option<NaiveDate>,直接对每个日期值调用format("%A")即可得到星期全称字符串。
  3. 错误处理:替换了原代码中的unwrap()为?,符合Rust的错误处理规范,避免panic。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:36:21