You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Rust Polars中按每日时间范围过滤时序数据

在Rust Polars中过滤每日09:00-16:00的时序数据

要精准筛选出每日09:00:00到16:00:00(包含两端)的记录,你需要同时判断时间的小时、分钟甚至秒数,而非仅通过小时范围过滤。以下是两种可行的实现方案:

方案一:利用当日秒数判断(简洁高效)

通过dt().second_of_day()将时间转换为当日总秒数,直接判断该值是否落在9:00(32400秒)到16:00(57600秒)的区间内:

let filtered_df = df
    .lazy()
    .filter(
        col("time")
            .dt()
            .second_of_day()
            .gt_eq(32400) // 9*3600,对应09:00:00
            .and(col("time").dt().second_of_day().lt_eq(57600)) // 16*3600,对应16:00:00
    )
    .collect()?;

方案二:组合小时、分钟、秒条件(直观可控)

拆分逻辑:保留9:00-15:59:59的所有记录,同时仅保留16:00:00这一条记录:

let filtered_df = df
    .lazy()
    .filter(
        // 保留9点到15点的所有记录
        col("time").dt().hour().gt_eq(9).and(col("time").dt().hour().lt(16))
        // 额外保留16:00:00的记录
        .or(
            col("time").dt().hour().eq(16)
                .and(col("time").dt().minute().eq(0))
                .and(col("time").dt().second().eq(0))
        )
    )
    .collect()?;

原代码失效原因

你之前仅通过hour().gt_eq(9).and(hour().lt_eq(16))筛选,会把16点整之后的所有记录(比如16:25、16:55)包含进来——这些记录的小时数仍为16,符合条件,但超出了你需要的时间范围。

关于Polars的条件逻辑

如果需要更复杂的分支判断,Polars提供when/then/otherwise表达式实现类似if/else的逻辑,但在这个场景下,直接组合范围和精确匹配条件会更高效。

内容的提问来源于stack exchange,提问作者nklsla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:25:17