合并数据帧(具有不同的日期时间——每月和每天),同时将滞后值应用于其中一个数据帧



我有两个数据帧要合并:

df1看起来像这样:

Date          Col1  Col 2  Col 3    Col 4   

2016-03     27.57   0.93    28.7    1.57    
2016-04     25.83   0.23    28.34   0.84    
2016-05     24.55   0.27    27.11   0.03    

df2看起来是这样的:

Date          ColA            
2016-03-21  7.640769230769231   
2016-03-22  7.739720279720279   
2016-03-23  7.577311827956988   
2016-03-24  7.745416666666666   

正如您所看到的,df1是每月数据,df2是每日数据。然而,我想将它们合并为每日格式(遵循df2),但我也希望df1滞后(滞后=-30)

这是我想要的输出:

输出:

Date          ColA              Col1  Col 2  Col 3    Col 4     

2016-03-21  7.640769230769231   25.83   0.23    28.34   0.84
2016-03-22  7.739720279720279   25.83   0.23    28.34   0.84
2016-03-23  7.577311827956988   25.83   0.23    28.34   0.84
2016-03-24  7.745416666666666   25.83   0.23    28.34   0.84

....2016-04-01  xxxxxxxx            24.55   0.27    27.11   0.03

我试过了,但是,它们只是合并了,没有应用滞后。

out = (df2.merge(df1.shift(-30), on='Date').axis=1)

编辑:由于我无法使以下建议对我的具体问题有效,我所做的是:

out['Col1']= out['Col1'].shift(7).dropna()
out = pd.merge_asof(df1, df2,  on = 'Date')

这是只滞后1列(我决定这样做,因为大多数列都可能有不同的滞后时间

对于合并使用merge_asof:

print (df1)
Date   Col1  Col 2  Col 3  Col 4
0  2016-03  27.57   0.93  28.70   1.57
1  2016-04  25.83   0.23  28.34   0.84
2  2016-05  24.55   0.27  27.11   0.03
df1['Date'] = pd.to_datetime(df1['Date'])
print (df1)
Date   Col1  Col 2  Col 3  Col 4
0 2016-03-01  27.57   0.93  28.70   1.57
1 2016-04-01  25.83   0.23  28.34   0.84
2 2016-05-01  24.55   0.27  27.11   0.03


np.random.seed(20)
df2 = pd.DataFrame({'Date': pd.date_range('2016-02-20', periods=20),
'ColA': np.random.randint(5, size=20)})

print (df2)
Date  ColA
0  2016-02-20     3
1  2016-02-21     2
2  2016-02-22     4
3  2016-02-23     2
4  2016-02-24     1
5  2016-02-25     4
6  2016-02-26     3
7  2016-02-27     2
8  2016-02-28     0
9  2016-02-29     0
10 2016-03-01     2
11 2016-03-02     2
12 2016-03-03     3
13 2016-03-04     3
14 2016-03-05     0
15 2016-03-06     0
16 2016-03-07     1
17 2016-03-08     2
18 2016-03-09     2
19 2016-03-10     3

#default direction='backward'
df = pd.merge_asof(df2, df1, on='Date', tolerance=pd.Timedelta(7, 'days'))
print (df)
Date  ColA   Col1  Col 2  Col 3  Col 4
0  2016-02-20     3    NaN    NaN    NaN    NaN
1  2016-02-21     2    NaN    NaN    NaN    NaN
2  2016-02-22     4    NaN    NaN    NaN    NaN
3  2016-02-23     2    NaN    NaN    NaN    NaN
4  2016-02-24     1    NaN    NaN    NaN    NaN
5  2016-02-25     4    NaN    NaN    NaN    NaN
6  2016-02-26     3    NaN    NaN    NaN    NaN
7  2016-02-27     2    NaN    NaN    NaN    NaN
8  2016-02-28     0    NaN    NaN    NaN    NaN
9  2016-02-29     0    NaN    NaN    NaN    NaN
10 2016-03-01     2  27.57   0.93   28.7   1.57
11 2016-03-02     2  27.57   0.93   28.7   1.57
12 2016-03-03     3  27.57   0.93   28.7   1.57
13 2016-03-04     3  27.57   0.93   28.7   1.57
14 2016-03-05     0  27.57   0.93   28.7   1.57
15 2016-03-06     0  27.57   0.93   28.7   1.57
16 2016-03-07     1  27.57   0.93   28.7   1.57
17 2016-03-08     2  27.57   0.93   28.7   1.57
18 2016-03-09     2    NaN    NaN    NaN    NaN
19 2016-03-10     3    NaN    NaN    NaN    NaN

df = pd.merge_asof(df2, df1, on='Date', 
tolerance=pd.Timedelta(7, 'days'), direction='forward')
print (df)
Date  ColA   Col1  Col 2  Col 3  Col 4
0  2016-02-20     3    NaN    NaN    NaN    NaN
1  2016-02-21     2    NaN    NaN    NaN    NaN
2  2016-02-22     4    NaN    NaN    NaN    NaN
3  2016-02-23     2  27.57   0.93   28.7   1.57
4  2016-02-24     1  27.57   0.93   28.7   1.57
5  2016-02-25     4  27.57   0.93   28.7   1.57
6  2016-02-26     3  27.57   0.93   28.7   1.57
7  2016-02-27     2  27.57   0.93   28.7   1.57
8  2016-02-28     0  27.57   0.93   28.7   1.57
9  2016-02-29     0  27.57   0.93   28.7   1.57
10 2016-03-01     2  27.57   0.93   28.7   1.57
11 2016-03-02     2    NaN    NaN    NaN    NaN
12 2016-03-03     3    NaN    NaN    NaN    NaN
13 2016-03-04     3    NaN    NaN    NaN    NaN
14 2016-03-05     0    NaN    NaN    NaN    NaN
15 2016-03-06     0    NaN    NaN    NaN    NaN
16 2016-03-07     1    NaN    NaN    NaN    NaN
17 2016-03-08     2    NaN    NaN    NaN    NaN
18 2016-03-09     2    NaN    NaN    NaN    NaN
19 2016-03-10     3    NaN    NaN    NaN    NaN

df = pd.merge_asof(df2, df1, on='Date', 
tolerance=pd.Timedelta(7, 'days'), direction='nearest')
print (df)
Date  ColA   Col1  Col 2  Col 3  Col 4
0  2016-02-20     3    NaN    NaN    NaN    NaN
1  2016-02-21     2    NaN    NaN    NaN    NaN
2  2016-02-22     4    NaN    NaN    NaN    NaN
3  2016-02-23     2  27.57   0.93   28.7   1.57
4  2016-02-24     1  27.57   0.93   28.7   1.57
5  2016-02-25     4  27.57   0.93   28.7   1.57
6  2016-02-26     3  27.57   0.93   28.7   1.57
7  2016-02-27     2  27.57   0.93   28.7   1.57
8  2016-02-28     0  27.57   0.93   28.7   1.57
9  2016-02-29     0  27.57   0.93   28.7   1.57
10 2016-03-01     2  27.57   0.93   28.7   1.57
11 2016-03-02     2  27.57   0.93   28.7   1.57
12 2016-03-03     3  27.57   0.93   28.7   1.57
13 2016-03-04     3  27.57   0.93   28.7   1.57
14 2016-03-05     0  27.57   0.93   28.7   1.57
15 2016-03-06     0  27.57   0.93   28.7   1.57
16 2016-03-07     1  27.57   0.93   28.7   1.57
17 2016-03-08     2  27.57   0.93   28.7   1.57
18 2016-03-09     2    NaN    NaN    NaN    NaN
19 2016-03-10     3    NaN    NaN    NaN    NaN

IIUC,您可以使用:

df1['Date'] = pd.to_datetime(df1['Date'])
df2['Date'] = pd.to_datetime(df2['Date'])
out = (df2.merge(df1.assign(Date=df1['Date'].sub(pd.DateOffset(months=1))
.dt.to_period('M')),
left_on=df2['Date'].dt.to_period('M'), right_on='Date',
how='left', suffixes=(None, '_df1'))
) 

或:

out = (df2.merge(df1.assign(Date=df1['Date'].dt.to_period('M').sub(1)),
left_on=df2['Date'].dt.to_period('M'), right_on='Date',
how='left', suffixes=(None, '_df1'))
)

输出:

Date      ColA Date_df1   Col1  Col 2  Col 3  Col 4
0 2016-03-21  7.640769  2016-03  25.83   0.23  28.34   0.84
1 2016-03-22  7.739720  2016-03  25.83   0.23  28.34   0.84
2 2016-03-23  7.577312  2016-03  25.83   0.23  28.34   0.84
3 2016-03-24  7.745417  2016-03  25.83   0.23  28.34   0.84

最新更新