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