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

时间:2019-02-27 18:44:14

标签: python pandas

我有一个数据框,其中有一个字段“ Process Date”和另一个字段“ Effective_date”。 “有效日期”字段包含日期列表。我要完成的工作是选择与提交的“处理日期”中包含的日期最接近的日期,而不要重复。 (换句话说,最近的日期)。例如,在下面的框架中,第[0]行中的第一个“处理日期”-2014/4/14应该最多匹配3/2/2010。

预先感谢您的帮助。

cd /home/archy && montage *.png -tile 1x -geometry +1+1 total.png

1 个答案:

答案 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