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