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

如何使用Python查找行数据中不超过指定日期的最近日期

实现思路

核心逻辑分两步处理表格数据:

  • 先将所有日期字段统一转换为标准datetime格式,避免字符串按字符比较导致的结果错误,注意原始数据是日/月/年 时:分:秒格式,转换时需指定对应解析规则
  • 逐行遍历三个候选日期字段,先过滤掉晚于Given_Date的无效值,再计算剩余有效日期和Given_Date的时间差,取时间差最小的日期对应的字段名存入新字段
完整代码(基于pandas实现)
import pandas as pd

# 构造样例数据,实际使用时替换为pd.read_csv()/pd.read_excel()等读取本地数据的方法
df = pd.DataFrame([
    ["23/12/2022 12:56:49", "27/12/2022 11:22:32", "30/12/2022 12:32:53", "26/12/2022 13:22:39"],
    ["03/12/2022 11:23:46", "05/12/2022 13:42:12", "07/12/2022 11:11:21", "08/12/2022 13:15:20"],
    ["15/11/2022 09:07:56", "16/11/2022 10:37:51", "18/11/2022 21:13:22", "16/11/2022 13:21:23"]
], columns=["Date_1", "Date_2", "Date_3", "Given_Date"])

# 批量转换日期格式
all_date_cols = ["Date_1", "Date_2", "Date_3", "Given_Date"]
for col in all_date_cols:
    df[col] = pd.to_datetime(df[col], format="%d/%m/%Y %H:%M:%S")

# 定义单行匹配规则
def get_closest_date_col(row):
    given_date = row["Given_Date"]
    valid_candidates = []
    for col in ["Date_1", "Date_2", "Date_3"]:
        current = row[col]
        # 仅保留不晚于给定日期的项
        if current <= given_date:
            delta = given_date - current
            valid_candidates.append( (delta, col) )
    # 无有效候选时返回None,可根据业务需求调整兜底返回值
    if not valid_candidates:
        return None
    # 按时间差从小到大排序,取最接近的字段名
    valid_candidates.sort()
    return valid_candidates[0][1]

# 逐行应用规则生成结果字段
df["Closest_Date"] = df.apply(get_closest_date_col, axis=1)
运行结果验证

执行代码后打印df["Closest_Date"]可得到如下结果,完全匹配预期:

0    Date_1
1    Date_3
2    Date_2
Name: Closest_Date, dtype: object
注意事项
  • 日期转换环节必须指定format="%d/%m/%Y %H:%M:%S"参数,否则pandas默认会优先按月/日/年解析,会导致日期识别错误
  • 如果存在多个候选日期和Given_Date的时间差完全相等,代码会按照Date_1 > Date_2 > Date_3的优先级返回靠前的字段,可根据需求调整遍历顺序修改优先级
  • 如果某行三个日期都晚于Given_Date,当前代码返回None,可根据业务规则修改兜底逻辑,比如返回最晚的日期、返回空字符串等

内容的提问来源于stack exchange,提问作者Andi Khalil Gibran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:39:34