如何在Rust Polars中基于现有日期列生成加1天的新日期列
在Rust Polars中给日期列添加延后1天的新列
推荐方案:使用Polars内置日期偏移函数
Polars针对日期类型提供了原生的偏移操作,无需手动处理元素类型,代码简洁且性能更优:
use polars::prelude::*; fn main() -> Result<(), Box<dyn std::error::Error>> { // 构造示例DataFrame let df = df!( "made_on" => &[ date(2021, 6, 4), date(2021, 12, 31), date(2021, 12, 31), date(2021, 12, 30), date(2022, 8, 6), date(2022, 8, 6), ] )?; // 添加for_date列,值为made_on延后1天 let df_with_for_date = df.with_column( col("made_on") .date() .offset(1, TimeUnit::Days) .alias("for_date") )?; println!("{}", df_with_for_date); Ok(()) }
代码说明:
col("made_on").date():将列表达式转换为日期类型专用的表达式,方便调用日期相关方法.offset(1, TimeUnit::Days):对日期列执行偏移操作,参数分别是偏移量和时间单位.alias("for_date"):为新列指定名称
手动map实现方案(适合理解类型逻辑)
如果需要手动处理每个日期元素,需注意Polars中Date类型底层存储为Date32(用i32表示从1970-01-01起的天数),代码如下:
use polars::prelude::*; fn main() -> Result<(), Box<dyn std::error::Error>> { let df = df!( "made_on" => &[ date(2021, 6, 4), date(2021, 12, 31), date(2021, 12, 31), date(2021, 12, 30), date(2022, 8, 6), date(2022, 8, 6), ] )?; let df_with_for_date = df.with_column( col("made_on") .map(|series| { // 将Series转换为Date32类型的ChunkedArray let date_array = series.date()?; // 对每个日期值加1天(处理可能的缺失值) let new_dates = date_array.apply(|opt_date| opt_date.map(|days_since_epoch| days_since_epoch + 1)); // 转换回Series返回 Ok(new_dates.into_series()) }) .alias("for_date") )?; println!("{}", df_with_for_date); Ok(()) }
代码说明:
series.date():将通用Series转换为ChunkedArray<Date32>,获取日期的底层存储值apply方法:遍历每个元素,处理缺失值(Option<i32>),对有效日期加1天- 最后将处理后的ChunkedArray转换回Series,完成列的生成
内容的提问来源于stack exchange,提问作者kykyi
相关产品推荐
相关产品推荐

