在rust中按日期过滤极坐标 Dataframe

rt4zxlrg  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(127)

我试图按日期过滤 Dataframe ,但对于“2019-11-01 10:15:00”这样的日期,用表达式like this过滤 Dataframe 会很麻烦。
我的目标是做一些类似python version的东西:

use polars::export::chrono::NaiveDateTime;
use polars::prelude::*;
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let df = LazyCsvReader::new(path)
        .with_parse_dates(true)
        .has_header(true)
        .finish()?
        .collect()?;

    let dt = NaiveDateTime::parse_from_str("2019-11-01 10:15:00", "%Y-%m-%d %H:%M:%S")?;

    //This will not compile!
    let filtered = df.filter(col("time") < dt); 
}

然而,我有一个非常困难的时间来过滤日期框到位或只是创建一个布尔掩码。

oknwwptz

oknwwptz1#

经过更多的时间,我不敢承认我终于解决了它使用渴望API,可能有一个更好的解决方案在懒惰API,但这工程现在!

use polars::export::chrono::NaiveDateTime;
use polars::prelude::*;
fn main() -> Result<(), Box<dyn std::error::Error>> {

    let df = LazyCsvReader::new(path)
        .with_parse_dates(true)
        .has_header(true)
        .finish()?
        .collect()?;

// Set date to filter by
    let dt = NaiveDateTime::parse_from_str("2019-11-01 10:15:00", "%Y-%m-%d %H:%M:%S")?;

// Create boolean mask
    let mask = df["time"]
        .datetime()?
        .as_datetime_iter()
        .map(|x| x.unwrap() < dt)
        .collect();

// New filtered df
    let filtered_df = df.filter(&mask)?;
}

要从“time”列获取日期值并将其解析为NaiveDateTime:

fn main() -> Result<(), Box<dyn std::error::Error>> {

    // Lets take the last date from a series of datetime[µs]
    let date: Vec<Option<NaiveDateTime>> = df["time"]
        .tail(Some(1))
        .datetime()?
        .as_datetime_iter()
        .collect();

    // Create new NaiveDateTime, can be used as filter/condition in map-function
    let dt2 = NaiveDateTime::parse_from_str(&date[0].unwrap().to_string(), "%Y-%m-%d %H:%M:%S")?;
}

相关问题