如何在Rust Polars中从Vec<NaiveDateTime>创建Series?
在Rust Polars中基于NaiveDateTime集合创建Series
Polars 中处理 datetime 类型时,由于需要额外的元数据(时间精度、时区),无法像整数/浮点数那样直接使用from_vec,但可以通过以下两种方式实现:
方法一:直接使用from_naive_datetimes构造(推荐)
Polars 提供了DatetimeChunked::from_naive_datetimes方法,可直接接收chrono::NaiveDateTime的集合,同时指定时间精度:
use polars::prelude::*; use chrono::NaiveDateTime; fn main() { // 示例:你的NaiveDateTime集合 let naive_dt_vec = vec![ NaiveDateTime::from_timestamp_opt(1620000000, 0).unwrap(), NaiveDateTime::from_timestamp_opt(1620003600, 0).unwrap(), NaiveDateTime::from_timestamp_opt(1620007200, 0).unwrap(), ]; // 构造DatetimeChunked let dt_chunked = DatetimeChunked::from_naive_datetimes( "datetime_col", // 列名 &naive_dt_vec, // NaiveDateTime集合 TimeUnit::Milliseconds, // 指定时间精度(可选:Nanoseconds/ Microseconds/ Milliseconds/ Seconds) ); // 转换为Series let dt_series = dt_chunked.into_series(); }
方法二:手动转换为时间戳后构造
如果你需要更灵活地控制时间戳的精度,可以先将NaiveDateTime转换为对应精度的整数时间戳,再通过from_vec构造DatetimeChunked,最后补充元数据:
use polars::prelude::*; use chrono::NaiveDateTime; fn main() { let naive_dt_vec = vec![ NaiveDateTime::from_timestamp_opt(1620000000, 0).unwrap(), NaiveDateTime::from_timestamp_opt(1620003600, 0).unwrap(), NaiveDateTime::from_timestamp_opt(1620007200, 0).unwrap(), ]; // 将NaiveDateTime转为毫秒级时间戳(i64) let timestamps: Vec<i64> = naive_dt_vec .iter() .map(|dt| dt.timestamp_millis()) .collect(); // 构造DatetimeChunked并补充元数据 let dt_chunked = DatetimeChunked::from_vec("datetime_col", timestamps) .with_time_unit(TimeUnit::Milliseconds) // 设置时间精度 .with_time_zone(None); // None表示无时区(对应naive datetime) let dt_series = dt_chunked.into_series(); }
关键说明
- 整数/浮点数类型仅需存储数值,因此
from_vec即可直接构造;但datetime类型需要携带时间精度和时区元数据,因此需要专用构造方法。 - 如果需要带时区的datetime,可将
with_time_zone的参数替换为Some(TimeZone::new("UTC".into()).unwrap())(需启用polars-timezone特性)。
内容的提问来源于stack exchange,提问作者Glenn Pierce
相关产品推荐
相关产品推荐

