在最近的日期合并2个数据帧

时间:2017-10-10 00:01:53

标签: python-2.7 pandas date merge

我有2个数据框,第0列为'日期'。

辅助日期多于主日期,它们不同(虽然时间紧密)。

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

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

日期应该与此逻辑合并,尽管只保留Date Main和两个数据帧的其余列:

(按时间顺序反向排序)

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

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

  

Merge dataframe on closest date

这个看起来很相似,但我不知道如何将它应用到我的案例中。

  

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

1 个答案:

答案 0 :(得分: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