rust极坐标将字符串列转换为日期时间

9nvpjoqh  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(176)

我正在学习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();
lfapxunr

lfapxunr1#

乍一看,df似乎是DataFrame而不是LazyFrame,您可以从带有df.lazy()的DataFrame中获取LazyFrame,也可以从带有lazy_df.collect()的LazyFrame中获取DataFrame。

相关问题