如何使用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
相关产品推荐
相关产品推荐

