我正在读取一个以月-日-年格式显示日期的csv文件(例如"2022年11月15日").但月份和日期没有0填充.下面是我的测试代码

use polars::prelude::*;
use polars_lazy::prelude::*;

fn main() {
    let df = df![
        "x" => ["1/4/2011", "2/4/2011", "3/4/2011", "4/4/2011"],
        "y" => [1, 2, 3, 4],
    ].unwrap();
    let lf: LazyFrame = df.lazy();

    let options = StrpTimeOptions {
        fmt: Some("%m/%d/%Y".into()),
        date_dtype: DataType::Date,
        ..Default::default()
    };

    let res = lf.clone()
    .with_column(col("x").str().strptime(options).alias("new time"))
    .collect().unwrap();

    println!("{:?}", res);

}

输出为

shape: (4, 3)
┌──────────┬─────┬──────────┐
│ x        ┆ y   ┆ new time │
│ ---      ┆ --- ┆ ---      │
│ str      ┆ i32 ┆ date     │
╞══════════╪═════╪══════════╡
│ 1/4/2011 ┆ 1   ┆ null     │
├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ 2/4/2011 ┆ 2   ┆ null     │
├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ 3/4/2011 ┆ 3   ┆ null     │
├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┤
│ 4/4/2011 ┆ 4   ┆ null     │

options中,我try 了"%-m/%-d/%Y,而不是documentation中提到的"%m/%d/%Y.但它在运行时感到panic .

thread '<unnamed>' panicked at 'attempt to subtract with overflow', /home/xxx/.cargo/registry/src/github.com-1ecc6299db9ec823/polars-time-0.21.1/src/chunkedarray/utf8/mod.rs:234:33

阅读此格式的正确方法是什么.我正在使用"Ubuntu 20.04.4 LTS"

推荐答案

您的Default使用错误的标志运行.您需要将exact设置为true:

...
    let options = StrpTimeOptions {
        fmt: Some("%-m/%-d/%Y".into()),
        date_dtype: DataType::Date,
        exact: true,
        ..Default::default()
    };
...

已测试包含填充的完整代码:

use polars::prelude::*;
use polars_lazy::dsl::StrpTimeOptions;
use polars_lazy::prelude::{col, IntoLazy, LazyFrame};

fn main() {
    let df = df![
        "x" => ["01/04/2011", "2/4/2011", "3/4/2011", "4/4/2011"],
        "y" => [1, 2, 3, 4],
    ]
    .unwrap();
    let lf: LazyFrame = df.lazy();

    let options = StrpTimeOptions {
        fmt: Some("%-m/%-d/%Y".into()),
        date_dtype: DataType::Date,
        exact: true,
        ..Default::default()
    };

    let res = lf
        .clone()
        .with_column(col("x").str().strptime(options).alias("new time"))
        .collect()
        .unwrap();

    println!("{:?}", res);
}

输出:

shape: (4, 3)
┌────────────┬─────┬────────────┐
│ x          ┆ y   ┆ new time   │
│ ---        ┆ --- ┆ ---        │
│ str        ┆ i32 ┆ date       │
╞════════════╪═════╪════════════╡
│ 01/04/2011 ┆ 1   ┆ 2011-01-04 │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 2/4/2011   ┆ 2   ┆ 2011-02-04 │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 3/4/2011   ┆ 3   ┆ 2011-03-04 │
├╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 4/4/2011   ┆ 4   ┆ 2011-04-04 │
└────────────┴─────┴────────────┘

Rust相关问答推荐

是否可以为`T:Copy`执行`T. clone`的测试

关于Rust 中回归的逻辑

如何提高自定义迭代器的`extend`性能

避免在Collect()上进行涡鱼类型的涂抹,以产生<;Vec<;_>;,_>;

写入引用会更新基础值,但引用会打印意外的值

装箱特性如何影响传递给它的参数的生命周期 ?(举一个非常具体的例子)

是否可以使用Serde/Rust全局处理无效的JSON值?

如何正确使用git2::Remote::push?

Rust FFI 和 CUDA C 性能差异

方法可以被误认为是标准特性方法

通过mem::transmute将数组展平安全吗?

如何从 x86_64 Mac 构建 M1 Mac?

如何判断服务器是否正确接收数据

如何将 Rust 字符串转换为 i8(c_char) 数组?

以下打印数组每个元素的 Rust 代码有什么问题?

Rust 内联 asm 中的向量寄存器:不能将 `Simd` 类型的值用于内联汇编

有没有办法在 Rust 中对 BigInt 进行正确的位移?

如何构建包含本地依赖项的 docker 镜像?

为什么 Rust 中的关联类型需要明确的生命周期注释?

来自外部函数的future 内部可变引用