如何用if语句或Lambda函数基于两个日期列返回特定字符串?
基于日期差返回特定字符串的实现方案
嘿,我来帮你搞定这个需求!先回顾下你已经完成的工作:你已经筛选出了状态为Traded Away且到期日不为0的记录,把日期转成了datetime类型,还计算出了到期日与当前日期的天数差,这一步已经为后续的判断打好了基础。
接下来我们只需要基于Days的数值,按照你的规则返回对应的字符串就行。下面是具体的实现步骤和代码:
第一步:优化日期差计算(转成整数天数)
你当前的Days列是timedelta类型,我们可以提取其中的整数天数,这样后续的条件判断会更直观:
import numpy as np import pandas as pd # 你的现有代码(做了一点小优化:去掉时分秒避免误差) df_Date = df[df['state'].str.contains('Traded Away') & df['maturity_date']!=0][['state','maturity_date']] df_Date['maturity_date'] = pd.to_datetime(df_Date['maturity_date']) df_Date['Today'] = pd.to_datetime('today').normalize() # 去掉时分秒,确保日期比较的准确性 df_Date['Days'] = (df_Date['maturity_date'] - df_Date['Today']).dt.days # 提取整数天数
第二步:定义规则并生成结果字符串
我们可以用np.select来批量处理多条件判断,这种方法比循环apply效率高很多,适合大数据量的场景。下面是示例规则(你可以根据实际需求修改):
- 如果
Days < 0:到期日已过,返回"已过期" - 如果
0 ≤ Days ≤ 30:30天内到期,返回"即将到期(30天内)" - 如果
Days > 30:距离到期还有一段时间,返回"距离到期还有X天"(X为具体天数)
对应的代码如下:
# 定义判断条件列表 conditions = [ df_Date['Days'] < 0, (df_Date['Days'] >= 0) & (df_Date['Days'] <= 30), df_Date['Days'] > 30 ] # 定义对应条件的返回字符串 choices = [ "已过期", "即将到期(30天内)", df_Date['Days'].apply(lambda x: f"距离到期还有{x}天") ] # 添加新列存储结果 df_Date['Status'] = np.select(conditions, choices, default="未知状态") # 查看结果 print(df_Date.head(10))
示例输出
运行后你会得到类似这样的结果:
state maturity_date Today Days Status
0 Traded Away 2018-03-15 2024-05-20 -2258 已过期
10 Traded Away 2025-06-15 2024-05-20 391 距离到期还有391天
20 Traded Away 2024-06-10 2024-05-20 21 即将到期(30天内)
如果你需要调整判断规则,只需要修改conditions和choices列表即可,比如可以增加“90天内到期”“180天内到期”等更多细分规则。
内容的提问来源于stack exchange,提问作者Peter Lucas
相关产品推荐
相关产品推荐

