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

如何更简洁地筛选Polars DataFrame中最接近指定日期的行

如何更简洁地筛选Polars DataFrame中最接近指定日期的行

嘿,你原来的实现思路完全没问题!不过确实有更紧凑的写法,不需要额外创建临时的diff列就能完成筛选,直接在filter条件里完成所有计算:

import polars as pl
import datetime

data = {
    "date": ["2025-01-01", "2025-01-01", "2025-01-01", "2026-01-01"],
    "value": [1, 2, 3, 4],
}

df = pl.DataFrame(data).with_columns(pl.col("date").cast(pl.Date))
target_date = datetime.date(2024, 12, 31)

# 简洁版筛选
result = df.filter((pl.col("date") - target_date).abs() == (pl.col("date") - target_date).abs().min())

运行后得到的结果和你原来的方法完全一致:

shape: (3, 2)
┌────────────┬───────┐
│ date       ┆ value │
│ ---        ┆ ---   │
│ date       ┆ i64   │
╞════════════╪═══════╡
│ 2025-01-01 ┆ 1     │
│ 2025-01-01 ┆ 2     │
│ 2025-01-01 ┆ 3     │
└────────────┴───────┘

原理说明

这个写法的核心是直接在筛选条件中完成两步计算:

  1. 计算每一行日期与目标日期的绝对差值
  2. 找到所有绝对差值中的最小值,然后保留差值等于这个最小值的行

全程不需要额外存储临时列,代码更紧凑,逻辑也清晰。

如果之后需要扩展到分组场景(比如按某列分组后,找每组内最接近目标日期的行),只要给min()加上over子句就行:

# 示例:按某列分组后筛选每组最接近目标日期的行
result = df.filter(
    (pl.col("date") - target_date).abs() == 
    (pl.col("date") - target_date).abs().min().over("your_group_column")
)

备注:内容来源于stack exchange,提问作者FISR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:24:28