有一个棘手的问题。我在两个数据帧中都有两个带有日期时间数据的Pandas数据帧,第一个:
Date Number
2018-02-28 23:59:00 20
2018-03-01 00:37:00 35
2018-03-01 00:58:00 46
2018-03-01 02:14:00 11
2018-03-01 02:32:00 15
第二个:
Date Value
2018-02-28 23:50:00 20
2018-02-28 23:51:00 35
2018-02-28 23:52:00 46
2018-02-28 23:53:00 11
2018-02-28 23:54:00 15
2018-02-28 23:55:00 20
2018-02-28 23:56:00 35
2018-02-28 23:57:00 46
2018-02-28 23:58:00 11
2018-02-28 23:59:00 15
2018-03-01 00:00:00 15
正如您已经注意到的那样,第一个数据框中的日期只是随机日期,而第二个数据框中的日期按顺序增加,每行+1分钟。
我尝试实现的是在第二个日期列上加入第一个数据帧,但不像内部联接样式一对一,但是规则看起来像这样:从第一个数据帧获取日期(例如, ' 2018-02-28 23:59:00'并且从第二个数据框加入二十一行 - 从日期开始-10分钟,从日期开始加上+10(对于此示例,将来自' 2018年-02-28 23:49:00' 2018-03-01 00:09:00')。
我有点困惑 - 是否有任何Pandas过滤功能可以帮助实现这种合并?或者也许有一些纯粹的pythonic解决方案。
所需结果如下:
Date1 Date2 Value
2018-02-28 23:59:00 2018-02-28 23:49:00 20
2018-02-28 23:59:00 2018-02-28 23:50:00 35
2018-02-28 23:59:00 2018-02-28 23:51:00 46
2018-02-28 23:59:00 2018-02-28 23:52:00 15
2018-02-28 23:59:00 2018-02-28 23:53:00 20
2018-02-28 23:59:00 2018-02-28 23:54:00 35
2018-02-28 23:59:00 2018-02-28 23:55:00 46
2018-02-28 23:59:00 2018-02-28 23:56:00 11
2018-02-28 23:59:00 2018-02-28 23:57:00 15
2018-02-28 23:59:00 2018-02-28 23:58:00 20
2018-02-28 23:59:00 2018-02-28 23:59:00 35
2018-02-28 23:59:00 2018-03-01 00:00:00 46
2018-02-28 23:59:00 2018-03-01 00:01:00 11
2018-02-28 23:59:00 2018-03-01 00:02:00 15
2018-02-28 23:59:00 2018-03-01 00:03:00 20
2018-02-28 23:59:00 2018-03-01 00:04:00 35
2018-02-28 23:59:00 2018-03-01 00:05:00 46
2018-02-28 23:59:00 2018-03-01 00:06:00 11
2018-02-28 23:59:00 2018-03-01 00:07:00 15
2018-02-28 23:59:00 2018-03-01 00:08:00 20
2018-02-28 23:59:00 2018-03-01 00:09:00 46
感谢。
答案 0 :(得分:1)
所以,输入如:
import pandas as pd
df1 = pd.DataFrame({'Date1':[pd.datetime(2018,02,28, 23,59,00),pd.datetime(2018,03,01, 00,37,00)],
'Number': [20,35]})
df2 = pd.DataFrame({'Date2':[pd.datetime(2018,02,28,23,50,00), pd.datetime(2018,02,28,23,51,00),pd.datetime(2018,03,01,00,42,00)],
'Value':[20, 35, 46]})
首先,您可以在df1中创建一个列l_d2
,其中包含Date2
的{{1}}内所有Date1
的列表,例如df1
。你真正需要的过滤功能):
from datetime import timedelta
df1['l_d2'] = df1['Date1'].apply(lambda x: list(df2['Date2'][((x- timedelta(minutes=10)) <= df2['Date2']) & (df2['Date2'] <= (x + timedelta(minutes=10)))]))
然后在这个新列上创建一个带有stack
函数的系列,如:
s1 = df1.apply(lambda x: pd.Series(x['l_d2']),axis=1).stack().reset_index(level=1, drop=True)
s1.name = 'Date2' #same name as in df2 for merging after
最后,您可以通过将df_output
加入s1
,删除列df1
(不再有用)并与{{1}合并来创建愿望输出l_d2
}添加列df2
:
Value
我输入的结果如下:
df_output = df1.drop('l_d2', axis=1).join(s1).merge(df2, on ='Date2')