如何正确使用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(()) }
关键说明
- 处理Date类型Series:通过
date_series.date()?将通用Series转为DateChunked,这是Polars处理日期类型的专用接口。 - 遍历日期值:
DateChunked的into_iter()会返回Option<NaiveDate>,直接对每个日期值调用format("%A")即可得到星期全称字符串。 - 错误处理:替换了原代码中的
unwrap()为?,符合Rust的错误处理规范,避免panic。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

