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

如何用Python Pandas计算距特殊日期列表的最近/已过日期天数

解决方法

步骤1:统一日期格式并排序特殊日期

先把字符串格式的特殊日期列表转换为Pandas datetime类型,同时排序优化后续计算效率:

import pandas as pd

# 初始化示例DataFrame(实际使用替换为你的数据)
df = pd.DataFrame({'col1': ['23-11-2020', '25-05-2021']})
# 确保col1为datetime类型(若原数据已是datetime64可跳过此步)
df['col1'] = pd.to_datetime(df['col1'], format='%d-%m-%Y')

# 处理特殊日期列表
special_dates = ["25.11.2020", "23.11.2020", "01.06.2021", "20.05.2021"]
# 转换为datetime并排序
special_dates_dt = pd.to_datetime(special_dates, format='%d.%m.%Y').sort_values().to_list()

步骤2:定义函数计算最近日期差值

编写自定义函数,针对单个日期计算与所有特殊日期的时间差,分别筛选出最近的未来/已过日期并转换为天数:

def get_nearest_days(date):
    # 计算当前日期与所有特殊日期的时间差
    diffs = [dt - date for dt in special_dates_dt]
    
    # 最近未来日期:取时间差≥0中的最小值,转换为天数
    future_diffs = [d for d in diffs if d >= pd.Timedelta(days=0)]
    col2 = min(future_diffs).days if future_diffs else None  # 无未来日期时返回None,可按需替换
    
    # 最近已过日期:取时间差<0中的最大值(最接近当前日期),取绝对值转天数
    past_diffs = [d for d in diffs if d < pd.Timedelta(days=0)]
    col3 = max(past_diffs).days * -1 if past_diffs else None  # 无已过日期时返回None,可按需替换
    
    return pd.Series([col2, col3], index=['col2', 'col3'])

步骤3:应用函数生成新列

用apply方法将函数批量应用到col1的每个元素,生成目标列:

df[['col2', 'col3']] = df['col1'].apply(get_nearest_days)

最终结果

运行后得到符合需求的DataFrame:

col1  col2  col3
0 2020-11-23     2     0
1 2021-05-25     7     5

补充说明

  • Pandas的datetime和Timedelta会自动处理闰年、不同月份天数差异等日期逻辑,无需额外手动计算。
  • 若需处理无未来/已过特殊日期的场景,可将函数中的None替换为0或pd.NA等符合业务需求的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:06:25