python - 从列表 pandas 数据框中选择最近的日期

标签 python pandas

我有一个数据框,其中一个字段为“处理日期”,另一个字段为“有效日期”。 “Effective_date”字段包含日期列表。我想要完成的是选择与提交的“处理日期”中包含的日期最接近的日期,而不会超过。 (换句话说,距离过去最近的日期)。例如,在下面的框架中,第 [0] 行中的第一个“处理日期” - 4/14/2014 应匹配至 3/2/2010。

预先感谢您的帮助。

    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来查找应插入日期的位置。您的列表未排序,因此需要先完成此操作。您在 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[['处理日期', '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

关于python - 从列表 pandas 数据框中选择最近的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54912469/

相关文章:

python - 普适 8 和 Python

python - 忽略 NaN 的 Pandas 分组和转换

python - Pandas 根据一组删除重复项并保留最后一个值

Python:读取文件直到一行以二进制模式匹配字符串

python-3.x - 如何计算pandas列中非空元素的数量?

python - 如何添加每列均值的额外卷?

python - 如何根据另一个变量的计数创建一个变量,并按某个键分组?

python - Seaborn猫图: change position on x axis

python - 按分钟分组索引并计算平均值

python - 如何在 Bokeh 中完成 `set_xlim` 或 `set_ylim` ?