我正在学习rust
并使用polars
。我有一个简单的CSV文件
names,pdate,orders
alice,2023-02-12,2
alice,2023-02-18,1
alice,2023-02-22,6
bob,2022-12-10,1
bob,2022-12-14,1
bob,2022-12-30,4
我在使用中读到的
let mut df = CsvReader::from_path("t2.csv")
.unwrap()
.has_header(true)
.finish()
.unwrap();
println!("{}", df);
它会打印出预期的结果。但是,我想将列pdate
转换为一个日期,以便进一步使用它计算日期。我尝试了解决方案here
let dt_options = StrpTimeOptions {
date_dtype: DataType::Date,
fmt: Some("%Y-%m-%d".into()),
..Default::default()
};
let df = df.with_column(col("pdate").str().strptime(dt_options));
cargo check
出现以下错误
Checking test v0.1.0 (/home/xxxx/a1/rustp)
error[E0277]: the trait bound `Expr: IntoSeries` is not satisfied
--> test.rs:37:29
|
37 | let df = df.with_column(col("pdate").str().strptime(dt_options));
| ----------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `IntoSeries` is not implemented for `Expr`
| |
| required by a bound introduced by this call
|
= help: the following other types implement trait `IntoSeries`:
Arc<(dyn SeriesTrait + 'static)>
ChunkedArray<T>
Logical<DateType, Int32Type>
Logical<DatetimeType, Int64Type>
Logical<DurationType, Int64Type>
Logical<TimeType, Int64Type>
polars::prelude::Series
这似乎是一个相当基本的功能,但我还没有能够找到一个直接的解决方案,任何帮助将不胜感激。
编辑:下面的代码可以工作,但是它有一个新的问题,我试图找到两个日期列之间的差值,以天为单位,作为一个浮点数,但是它出来了Duration
let df2 = df
.clone()
.lazy()
.with_column(col("pdate").str().strptime(dt_options).alias("dt_pdate"))
.groupby(["names"])
.agg([
col("dt_pdate").shift(1).alias("prev_date"),
col("orders"),
col("dt_pdate"),
])
.explode(["prev_date", "orders", "dt_pdate"])
.select([all(), (col("dt_pdate") - col("prev_date")).alias("delta")])
.collect()
.unwrap();
1条答案
按热度按时间lfapxunr1#
乍一看,df似乎是DataFrame而不是LazyFrame,您可以从带有
df.lazy()
的DataFrame中获取LazyFrame,也可以从带有lazy_df.collect()
的LazyFrame中获取DataFrame。