我有一个数据框,其中有一个字段“ Process Date”和另一个字段“ Effective_date”。 “有效日期”字段包含日期列表。我要完成的工作是选择与提交的“处理日期”中包含的日期最接近的日期,而不要重复。 (换句话说,最近的日期)。例如,在下面的框架中,第[0]行中的第一个“处理日期”-2014/4/14应该最多匹配3/2/2010。
预先感谢您的帮助。
cd /home/archy && montage *.png -tile 1x -geometry +1+1 total.png
答案 0 :(得分:1)
您可以使用np.searchsorted
查找日期应插入的位置。您的列表未排序,因此需要首先完成。您在DataFrame中有一个列表,所以这些都不会很快。您需要分别搜索每一行,因此我们将使用列表理解:
import pandas as pd
import numpy as np
from random import shuffle
df = pd.DataFrame({'Process Date': pd.date_range('2013-01-01', freq='3M', periods=10)})
l1 = pd.date_range('2012-01-01', freq='96D', periods=13).tolist()
shuffle(l1) #So it isn't ordered
df['Effective_Date']= [l1 for i in range(10)]
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'])]
print(df[['Process Date', 'Date_Before']])
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
鉴于建立索引,如果'Process Date'
在'Effective_Date'
中最早的日期之前(您将使用-1
进行索引并获取最新的日期),则将导致问题。在事实发生后解决此问题的方法可能最简单,也可以在列表理解中添加if-else
。
df.loc[df.Date_Before.gt(df['Process Date']), 'Date_Before'] = pd.NaT