2017-10-10 60 views
1

我有2个数据帧,第0列为'日期'。在最近的过去日期合并2个数据帧

有更多的次要日期比主要日期,他们是不同的(虽然时间紧)。

我想合并两个数据框,保留主日期作为参考,并选择辅助日期(行)根据主日期之前的直接日期合并。

main = pd.DataFrame({'Date':pd.to_datetime(
     ['2013-07-23', '2013-10-28', '2014-01-27', '2014-04-23', 
     '2014-07-22', '2014-10-20', '2015-01-27', '2015-04-27', 
     '2015-07-21', '2015-10-27', '2016-01-26', '2016-04-26', '2016-07-26']) }) 

     Date 
0 2013-07-23 
1 2013-10-28 
2 2014-01-27 
3 2014-04-23 
4 2014-07-22 
5 2014-10-20 
6 2015-01-27 
7 2015-04-27 
8 2015-07-21 
9 2015-10-27 
10 2016-01-26 
11 2016-04-26 
12 2016-07-26 

而且

sec = pd.DataFrame({'Date':pd.date_range('2013-07-01',periods=42,freq='1MS')}) 

     Date 
0 2013-07-01 
1 2013-08-01 
2 2013-09-01 
3 2013-10-01 
... 

38 2016-09-01 
39 2016-10-01 
40 2016-11-01 
41 2016-12-01 

日期应该与这个逻辑虽然只保留日期主要和列的其余两个dataframes合并:

(排序反向按时间顺序)

MERGED 
     Date Main Date Secondary 
0  2016-07-26 2016-07-01 
1  2016-04-26 2016-04-01 
2  2016-01-26 2016-01-01 
3  2015-10-27 2015-10-01 
4  2015-07-21 2015-07-01 
5  2015-04-27 2015-04-01 
6  2015-01-27 2015-01-01 
7  2014-10-20 2014-10-01 
8  2014-07-22 2014-07-01 
9  2014-04-23 2014-04-01 
10 2014-01-27 2014-01-01 
11 2013-10-28 2013-10-01 
12 2013-07-23 2013-07-01 

我发现的解决方案与合并2个最接近的日期有关,但对于这种情况,最接近的可能意味着违反“过去”条件的主日期之后的次日期。

Merge dataframe on closest date

这一看起来很相似,但我不知道如何将它应用到我的情况。

How to merge two dataframes based on the closest (or most recent) timestamp

+0

'pd.merge_asof()' – DJK

+0

感谢@ djk47463!我看到有一个参数tolerance = pd.Timedelta(),但如果我理解正确,它会找到最接近的值(可能是未来)。如何设定它过去? – Diego

+0

它只在过去最接近的工作,查看'allow_exact_matches'参数 – DJK

回答

1

下面是与merge_asof一试:

df = pd.merge_asof(main.set_index('Date').sort_index(), 
        sec.set_index('Date',drop=False).sort_index(), 
        left_index=True, 
        right_index=True, 
        direction='backward') # backward is the default, so you 
              # can leave this out if you prefer 

df.rename(columns={'Date':'Date_sec'})\ 
    .sort_index(ascending=False).reset_index() 

语法注:drop=False是必要的,以确保从二级数据框中的日期将被保留。没有它,合并的数据框将只包含主数据框的日期。

结果:

  Date Date_sec 
0 2016-07-26 2016-07-01 
1 2016-04-26 2016-04-01 
2 2016-01-26 2016-01-01 
3 2015-10-27 2015-10-01 
4 2015-07-21 2015-07-01 
5 2015-04-27 2015-04-01 
6 2015-01-27 2015-01-01 
7 2014-10-20 2014-10-01 
8 2014-07-22 2014-07-01 
9 2014-04-23 2014-04-01 
10 2014-01-27 2014-01-01 
11 2013-10-28 2013-10-01 
12 2013-07-23 2013-07-01 
+0

非常感谢,由于某种原因,我得到TypeError:merge_asof()得到了一个意想不到的关键字参数'方向' – Diego

+0

@Diego你可能有一个更老的版熊猫。我相信'方向'是在0.20.0中加入的,但'落后'是默认的,所以你可以放弃它。为了清楚起见,我在此仅添加它,因为即使在不必要的情况下使用关键字参数来显式更好也更好。 – JohnE

+1

你是对的!熊猫升级。现在我得到TypeError:'NoneType'对象在right_index = True时不可调用。研究,但无法找到任何线索... – Diego