Python Pandas: 如何根据日期组合或合并两个不同大小的数据框

Python Pandas: How to combine or merge two difrent size dataframes based on dates

我喜欢根据日期范围合并或合并两个不同大小的数据框 df1 和 df2,例如:

df1:

Date        Open  High  Low
2021-07-01  8.43  8.44  8.22 
2021-07-02  8.36  8.4   8.28
2021-07-06  8.22  8.23  8.06
2021-07-07  8.1   8.19  7.98
2021-07-08  8.07  8.1   7.91
2021-07-09  7.97  8.11  7.92
2021-07-12  8     8.2   8
2021-07-13  8.15  8.18  8.06
2021-07-14  8.18  8.27  8.12
2021-07-15  8.21  8.26  8.06
2021-07-16  8.12  8.23  8.07

df2:

Day of month   Revenue   Earnings
01             45000     4000
07             43500     5000
12             44350     6000
15             39050     7000

结果应该是这样的:

组合:

Date        Open  High  Low   Earnings
2021-07-01  8.43  8.44  8.22  4000
2021-07-02  8.36  8.4   8.28  4000
2021-07-06  8.22  8.23  8.06  4000
2021-07-07  8.1   8.19  7.98  5000
2021-07-08  8.07  8.1   7.91  5000
2021-07-09  7.97  8.11  7.92  5000
2021-07-12  8     8.2   8     6000
2021-07-13  8.15  8.18  8.06  6000
2021-07-14  8.18  8.27  8.12  6000
2021-07-15  8.21  8.26  8.06  7000
2021-07-16  8.12  8.23  8.07  7000

收入列是根据日期范围合并的,我如何在 python pandas 中执行此操作?

尝试merge_asof

#df1.date=pd.to_datetime(df1.date)
df1['Day of month'] = df1.Date.dt.day 
out = pd.merge_asof(df1, df2, on ='Day of month', direction = 'backward')
out
Out[213]: 
         Date  Open  High   Low  Day of month  Revenue  Earnings
0  2021-07-01  8.43  8.44  8.22           1    45000      4000
1  2021-07-02  8.36  8.40  8.28           2    45000      4000
2  2021-07-06  8.22  8.23  8.06           6    45000      4000
3  2021-07-07  8.10  8.19  7.98           7    43500      5000
4  2021-07-08  8.07  8.10  7.91           8    43500      5000
5  2021-07-09  7.97  8.11  7.92           9    43500      5000
6  2021-07-12  8.00  8.20  8.00          12    44350      6000
7  2021-07-13  8.15  8.18  8.06          13    44350      6000
8  2021-07-14  8.18  8.27  8.12          14    44350      6000
9  2021-07-15  8.21  8.26  8.06          15    39050      7000
10 2021-07-16  8.12  8.23  8.07          16    39050      7000

更通用的方法如下:

  1. 首先介绍两个数据框共享的关键。 在这种情况下,是一个月中的某一天(或者,可能是多个键,例如一个月中的某一天和一个月)。 df1["day"] = df1["Date"].dt.day
  2. 如果您现在要合并(leftjoin df2 on df1),您在 df2 中将没有足够的密钥,因为缺少天数。为了填补空白,我们可以进行插值,或使用朴素的方法:如果我们不知道特定日期的收入/收入,我们将采用最后一个已知日期,不再进行进一步计算。此处描述了一种实现此目的的方法: df.fillna(method='ffill')
  3. 现在我们合并我们的密钥。按照文档 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html ,我们这样做: df1.merge(df2, left_on='day')

瞧!