在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
相关产品推荐
相关产品推荐

