rust 根据现有系列和Map值创建新系列

7fyelxc5  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(148)

我的使用案例:我有一个带有野生时间戳(字符串)的列,我想将它们解析为时间戳类型。
The docs提到ChunkedArray是字符串的类型化容器。
但是,我无法完成这幅图画。

fn with_timestamps(mut df: DataFrame) -> Result<DataFrame, PolarsError> {
    let column = df.column("myTime")?.clone(); // clone, just for a good measure ...

    let ca = column.utf8()?; // ChunkedArray

    // I think I want something like this:
    let new_time = Series::new("newTime", ca.into_iter().map(|v: &str| 42).collect());

    // 42 is not a timestamp,
    // but maybe I can work on that from an integer

    df.with_column(new_time);
    df
}

除此之外,我需要找出.with_column()是否在适当的位置起作用,我很难从文档中确定我应该迭代什么,IS是SeriesChunkedArray,我是从新的ChunkedArray构造新的Series,还是从一个迭代器构造新的Series,我可以collect()或其他。

编辑

我也发现了this answer,经过一番努力,我得出了这个例子,它在我的例子中是有效的:

let df = df!("Fruit" => &["Apple", "Apple", "Pear"],
                            "Color" => &["Red", "Yellow", "Green"],
                            "Date" => &["02/21/2022 07:51:00 AM", "2/21/2022 07:51:00 AM", "2/21/2022 07:51:00 AM"])?;
let options = StrpTimeOptions {
    fmt: Some("%-m/%-d/%Y %I:%M:%S %p".into()),
    date_dtype: polars::datatypes::DataType::Datetime(TimeUnit::Milliseconds, None),
    exact: true,
    ..Default::default()
};

let foo = df
    .clone()
    .lazy()
    .with_columns([
       col("Date")
       .str()
       .strptime(options)
       .alias("parsed date")
     ])
    .collect();

请注意.lazy(),没有它,Exprcol("Foo").alias("bar")似乎不能直接使用(不是Series,而lazy API只需要一个表达式),而且我对Rust编译器消息的理解目前还不足以弄清楚为什么以及什么是惯用的方法。

qij5mzcb

qij5mzcb1#

所以我想这可能是你想要的:

let parsed_time: Series = df
    .column("myTime")?
    .clone()
    .utf8()?
    .into_iter()
    .map(| v: Option<&str> | your_parse_fn(v) )
    .collect();

df.with_column(parsed_time)
df

如果我是正确的--------这将覆盖您的数据!
评论并让我知道

相关问题