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

Pandas查找DataFrame起始日期后满足值条件的首条记录

解决方案

确保时间字段为标准datetime类型,按时间升序排序后做双条件筛选取首条即可,逻辑完全匹配需求。

前置准备

不管Date是普通列还是索引,先统一做类型转换和排序,避免原始数据倒序导致结果错误:

import pandas as pd

# 如果Date是索引,执行下面的类型转换+排序
df.index = pd.to_datetime(df.index)
df_sorted = df.sort_index(ascending=True)

# 如果Date是普通列,把上面两行替换成下面两行
# df['Date'] = pd.to_datetime(df['Date'])
# df_sorted = df.sort_values('Date', ascending=True)

你提供的示例数据是日期从新到旧倒序排列的,不排序直接取首条会得到错误结果2022-06-24。

单组参数计算

对应你举的测试案例,参数为Start Date=2022-06-14、Start Value=927:

start_date = pd.to_datetime('2022-06-14')
start_value = 927

# 双条件过滤:日期严格晚于起始日期 + 数值大于等于起始值
filter_mask = (df_sorted.index > start_date) & (df_sorted['Value'] >= start_value)
# 取过滤后第一条的日期
first_recurrence = df_sorted[filter_mask].index[0]

print(first_recurrence)
# 输出:Timestamp('2022-06-23 00:00:00'),和预期结果完全一致

按规则不需要处理End Date参数,过滤逻辑里直接忽略即可。

批量参数表计算

如果你的多组范围参数存在独立的参数DataFrame中,可以直接逐行应用计算逻辑生成First recurrence列:

# 先把参数表的日期列转成datetime类型
param_df['Start Date'] = pd.to_datetime(param_df['Start Date'])

def calc_first_recur(row):
    s_date = row['Start Date']
    s_val = row['Start Value']
    mask = (df_sorted.index > s_date) & (df_sorted['Value'] >= s_val)
    return df_sorted[mask].index[0]

param_df['First recurrence'] = param_df.apply(calc_first_recur, axis=1)

常见问题说明

  • 日期判断必须用>而非>=,符合「起始日期之后」的要求
  • 之前出现过滤后长度不一致的问题,是因为没有先限定日期范围,把起始日期之前符合数值条件的记录也纳入了匹配范围
  • 排序是必要步骤,否则取到的"第一条"是数据物理存储位置的首条,不是时间最早的匹配记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:27:17