Python 从数据框列表中选择最近的日期

Python 从数据框列表中选择最近的日期,python,pandas,Python,Pandas,我有一个数据框,其中一个字段是“流程日期”,另一个字段是“生效日期”。“生效日期”字段包含日期列表。我试图完成的是选择与“流程日期”字段中包含的日期最接近的日期,而不进行任何检查。(换句话说,距离过去最近的日期)。例如,在下面的框架中,第[0]行中的第一个“流程日期”-2014年4月14日应匹配到2010年3月2日 提前感谢你的帮助 Title Code Process Date Type Title_code \ 0 40493 4/4/2014 SI

我有一个数据框,其中一个字段是“流程日期”,另一个字段是“生效日期”。“生效日期”字段包含日期列表。我试图完成的是选择与“流程日期”字段中包含的日期最接近的日期,而不进行任何检查。(换句话说,距离过去最近的日期)。例如,在下面的框架中,第[0]行中的第一个“流程日期”-2014年4月14日应匹配到2010年3月2日

提前感谢你的帮助

    Title Code Process Date Type  Title_code  \
0        40493     4/4/2014   SI       40493   
1        40493    4/18/2014   SI       40493   
2        40493     5/2/2014   SI       40493   
3        40493    5/16/2014   SI       40493   
4        40493    5/30/2014   SI       40493   
5        40493    6/13/2014   SI       40493   
6        10251    10/4/2013  RIP       10251   
7        40491   10/18/2013   LD       40491   
8        40491   10/18/2013   SI       40491   
9        40491    11/1/2013   LD       40491   
10       40491    11/1/2013   SI       40491   
11       40491   11/15/2013   LD       40491   
12       40491   11/15/2013   SI       40491   

                                       Effective_date  
0                ['3/2/2010', '3/3/2017', '9/3/2016']  
1                ['3/2/2010', '3/3/2017', '9/3/2016']  
2                ['3/2/2010', '3/3/2017', '9/3/2016']  
3                ['3/2/2010', '3/3/2017', '9/3/2016']  
4                ['3/2/2010', '3/3/2017', '9/3/2016']  
5                ['3/2/2010', '3/3/2017', '9/3/2016']  
6   ['9/3/2011', '9/3/2012', '9/3/2013', '9/3/2014...  
7                            ['9/3/2016', '3/2/2010']  
8                ['3/2/2010', '3/3/2017', '9/3/2016']  
9                            ['9/3/2016', '3/2/2010']  
10               ['3/2/2010', '3/3/2017', '9/3/2016']  
11                           ['9/3/2016', '3/2/2010']  
12               ['3/2/2010', '3/3/2017', '9/3/2016']  

您可以使用
np.searchsorted
查找插入日期的位置。您的列表未排序,因此需要先完成此操作。数据帧中有一个列表,因此所有这些都不会特别快。您需要分别搜索每一行,因此我们将使用列表:

样本数据: 代码: 输出:
打印(df['处理日期','之前的日期]])


考虑到索引,如果
“流程日期”
早于
“生效日期”
中的最早日期,这将导致问题(您将使用
-1
索引并获取最新日期)。可能最简单的方法是在事后修复,或者在列表中添加
if-else

df.loc[df.Date_Before.gt(df['Process Date']), 'Date_Before'] = pd.NaT

日期是否存储为pd.datetimes对象或字符串?它们存储为datetimes,而不是字符串。谢谢到目前为止你试过什么?
df['Effective_Date'] = df['Effective_Date'].apply(np.sort)
df['Date_Before'] = [l[np.searchsorted(l, date)-1] 
                     for l,date in zip(df['Effective_Date'], df['Process Date'])]
  Process Date Date_Before
0   2013-01-31  2013-01-19
1   2013-04-30  2013-04-25
2   2013-07-31  2013-07-30
3   2013-10-31  2013-07-30
4   2014-01-31  2013-11-03
5   2014-04-30  2014-02-07
6   2014-07-31  2014-05-14
7   2014-10-31  2014-08-18
8   2015-01-31  2014-11-22
9   2015-04-30  2015-02-26
df.loc[df.Date_Before.gt(df['Process Date']), 'Date_Before'] = pd.NaT