如何更简洁地筛选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 │ └────────────┴───────┘
原理说明
这个写法的核心是直接在筛选条件中完成两步计算:
- 计算每一行日期与目标日期的绝对差值
- 找到所有绝对差值中的最小值,然后保留差值等于这个最小值的行
全程不需要额外存储临时列,代码更紧凑,逻辑也清晰。
如果之后需要扩展到分组场景(比如按某列分组后,找每组内最接近目标日期的行),只要给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
相关产品推荐
相关产品推荐

