如何在 polars 的 Rust 版本中解析没有 0 填充的日期和月份的日期字符串?
How to parse date string with days and months without 0 padding in rust version of polars?
我正在读取日期格式为月日年的 csv 文件(例如“11/15/2022”)。但是月和日没有 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
中,我尝试 "%-m/%-d/%Y
而不是 documentation 中提到的 "%m/%d/%Y
。但它在运行时出现恐慌。
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 │
└────────────┴─────┴────────────┘
我正在读取日期格式为月日年的 csv 文件(例如“11/15/2022”)。但是月和日没有 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
中,我尝试 "%-m/%-d/%Y
而不是 documentation 中提到的 "%m/%d/%Y
。但它在运行时出现恐慌。
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 │
└────────────┴─────┴────────────┘