我的用例:我有一列包含野生时间戳(字符串),我想将它们解析为时间戳类型。
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()
是否起作用,我很难从文档中确定我应该迭代什么。是 Series
、ChunkedArray
以及我是否从新的 ChunkedArray
或迭代器构造新的 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()
。如果没有它,Expr
(col("Foo").alias("bar"
) 似乎无法直接使用(不是Series
,而惰性 API 只需要一个表达式),而我对 Rust 编译器消息的理解目前还不足以弄清楚原因以及惯用的方式是什么。
最佳答案
所以我认为这可能就是您想要的:
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
如果我是对的--------- 这将覆盖您的数据!
发表评论并让我知道
关于rust - 从现有系列和 map 值创建新系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75746923/