找到即将到期的日期并根据它分配值 - Python数据框

Posted

技术标签:

【中文标题】找到即将到期的日期并根据它分配值 - Python数据框【英文标题】:Locate the Upcoming Expiry date and Assign the Value based on it - Python Data frame 【发布时间】:2021-10-18 22:29:33 【问题描述】:

有两个dataframe,需要根据Dataframe 1中的Active date从Dataframe2中提取最近即将到期的Expiry date,以获得正确的Value。

这是一个示例。原始数据包含数千行

数据框 1

df_1 = pd.DataFrame('Category': ['A','B'],
               'Active date': ['2021-06-20','2021-06-25'])

数据框 2

df_2 = pd.DataFrame('Category': ['A','A','A','A','A','B','B','B'],
               'Expiry date': ['2021-05-22','2021-06-23','2021-06-24','2021-06-28','2021-07-26','2021-06-27','2021-06-28','2021-08-29'],
                'Value': [20,21,23,45,12,34,17,34])

最终输出 -

我正在尝试的代码 -

df = pd.merge(df_1, df_2, on='Category', how='inner')
#Removed all the dates which are less than Active date
df = df.loc[(df_1['Active Date'] <= df_2['Expiry Date'])]

【问题讨论】:

【参考方案1】:

我相信此解决方案保留了您现有的大量代码,并将完成您正在寻找的内容。

df_1 = pd.DataFrame('Category': ['A','B'],
               'Active date': ['2021-06-20','2021-06-25'])

df_2 = pd.DataFrame('Category': ['A','A','A','A','A','B','B','B'],
               'Expiry date': ['2021-05-22','2021-06-23','2021-06-24','2021-06-28','2021-07-26','2021-06-27','2021-06-28','2021-08-29'],
                'Value': [20,21,23,45,12,34,17,34])

df = pd.merge(df_1, df_2, on='Category', how='inner')

# Removed all the dates which are less than Active date
df = df.loc[(df['Active date'] <= df['Expiry date'])]
df = df.rename(columns='Expiry date': 'Next Expiry Date')
df = df.loc[df['Next Expiry Date'] == df.groupby('Category')['Next Expiry Date'].transform('min')]

输出:

  Category Active date Next Expiry Date  Value
1        A  2021-06-20       2021-06-23     21
5        B  2021-06-25       2021-06-27     34

【讨论】:

我一直在寻找这样的东西,不知道如何一步完成。谢谢 谢谢,如果它适合您,请接受这个解决方案。【参考方案2】:

您可以使用 pandas merge_asof 并将方向设置为 forward。请注意,对于merge_asof,两个数据框都必须排序:

 df_1 = df_1.transform(pd.to_datetime, errors='ignore')
 df_2 = df_2.astype("Expiry date": np.datetime64)
 df_2 = df_2.sort_values('Expiry date')
 pd.merge_asof(df_1, 
               df_2, 
               left_on='Active date', 
               right_on='Expiry date', 
               direction='forward',
               by='Category')


        Category Active date Expiry date  Value
0        A       2021-06-20  2021-06-23     21
1        B       2021-06-25  2021-06-27     34

【讨论】:

我创建的样本非常有序和干净,但原始数据集不是那么干净。仅基于日期合并可能会产生一些麻烦。我们如何在其中引入类别@sammywemmy 您可以使用by 参数在类别列上合并

以上是关于找到即将到期的日期并根据它分配值 - Python数据框的主要内容,如果未能解决你的问题,请参考以下文章

Informix 密码即将到期异常

Ios 配置文件即将到期

Excel | EDATE函数计算合同到期日,DATEDIF计算距离到期日的天数,并设置“交通三色灯”提醒

DB2查询合并2个十进制列并找到最大值

Excel079 | EDATE函数计算合同到期日,DATEDIF计算距离到期日的天数,并设置“交通三色灯”提醒

如何在 mvc 5 中知道 OWIN cookie/用户会话即将到期