我有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
我找到的解决方案与合并最接近的两个日期有关,但对于这种情况,最接近的可能意味着主日期之后的次日期违反了过去的日期。条件。
这个看起来很相似,但我不知道如何将它应用到我的案例中。
How to merge two dataframes based on the closest (or most recent) timestamp
答案 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