Pandas如何使用query方法查询距指定日期最近的记录
pandas 就近日期匹配查询实现说明
pandas.query 原生没有内置你期望的~类非精确就近日期匹配操作符,无法直接写成query('Dates ~2017-1-1')的形式,但可以通过简单的时间差计算实现完全一致的筛选效果。
首先注意你示例代码里的小细节:生成的日期列名是Dates,查询时注意列名拼写一致。
具体实现逻辑分3步:
- 先用
query过滤出hue==0.6的候选记录集 - 计算候选集中每条记录的日期与目标日期
2017-01-01的绝对时间差 - 取时间差最小的记录即为结果
对应可直接运行的代码如下:
import pandas as pd import numpy as np from sklearn import datasets # 测试数据生成代码(和你提供的示例一致) df = pd.DataFrame(datasets.load_wine().data) df.columns = datasets.load_wine().feature_names df.columns=df.columns.str.strip() def random_dates(start, end, n, unit='D'): ndays = (end - start).days + 1 return pd.to_timedelta(np.random.rand(n) * ndays, unit=unit) + start np.random.seed(0) start = pd.to_datetime('2015-01-01') end = pd.to_datetime('2022-01-01') datelist=random_dates(start, end, 178) df['Dates'] = datelist # 核心查询逻辑 target_dt = pd.to_datetime('2017-01-01') # 写法1:链式调用,可读性更好 res = df.query('hue == 0.6') \ .assign(time_gap = lambda x: (x['Dates'] - target_dt).abs()) \ .nsmallest(1, 'time_gap') \ .drop(columns='time_gap') # 不需要保留时间差列可加这行 # 写法2:更精简的写法,直接取差值最小的行索引 res = df.query('hue == 0.6').loc[lambda x: (x['Dates'] - target_dt).abs().idxmin()]
注意:上述代码固定了随机种子
np.random.seed(0),运行后会得到唯一的匹配结果,筛选逻辑和你预期完全一致。如果需要高频使用这类就近匹配查询,可以自行封装pandas的query自定义表达式后端,添加你要的~操作符支持,但单次使用的话上面的代码已经足够简洁高效。
内容的提问来源于stack exchange,提问作者user18175092
相关产品推荐
相关产品推荐

