将Pandas数据帧中的Date列与Python中的过滤条件合并

时间:2018-04-26 14:38:49

标签: python pandas datetime dataframe merge

有一个棘手的问题。我在两个数据帧中都有两个带有日期时间数据的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 

感谢。

1 个答案:

答案 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')