如何合并 DataFrame,以便将对应于 *months* 的一个值应用于另一个的所有 *datetimes*?
How can DataFrames be merged such that the values of one that correspond to *months* get applied to all *datetimes* of the other?
这个问题在概念上类似于 。
我有两个 DataFrame。一个有一组对应于特定时间和日期的值 (df_1
)。另一个具有一组对应于特定月份 (df_2
) 的值,指定为一个月第一天的第一个时刻(例如 2015-07-01 00:00:00.00)。我想合并这些 DataFrame,以便 df_2
月份的值应用于相应月份的 df_1
的所有日期和时间。
所以,这里是 df_1
:
|DatetimeIndex|value_1|
|-------------|-------|
|2015-07-18 |10 |
|2015-07-18 |11 |
|2015-07-19 |12 |
|2015-07-20 |13 |
|2015-07-20 |14 |
|2015-07-20 |15 |
|2015-07-21 |16 |
|2015-07-22 |17 |
|2015-07-22 |18 |
|2015-07-23 |19 |
|2015-08-11 |20 |
这里是 df_2
:
|DatetimeIndex|value_2|
|-------------|-------|
|2015-07-01 |100 |
|2015-08-01 |200 |
我想像这样合并它们:
|DatetimeIndex|value_1|value_2|
|-------------|-------|-------|
|2015-07-18 |10 |100 |
|2015-07-18 |11 |100 |
|2015-07-19 |12 |100 |
|2015-07-20 |13 |100 |
|2015-07-20 |14 |100 |
|2015-07-20 |15 |100 |
|2015-07-21 |16 |100 |
|2015-07-22 |17 |100 |
|2015-07-22 |18 |100 |
|2015-07-23 |19 |100 |
|2015-08-11 |20 |200 |
因此,value_2
存在于每个月。
如何完成合并?
根据之前的回答,以下(有缺陷的)形式的解决方案似乎是正确的方法,但它失败了:
idx = df_1.index.union(df_2.index)
#df_1.join(df_2.loc[idx.date].set_index(idx), how = "outer")
df_1.join(df_2.loc[idx.month].set_index(idx), how = "outer")
只需使用合并
pd.merge(df_1.reset_index(), df_2, left_on=[df_1.index.year, df_1.index.month],
right_on=[df_2.index.year, df_2.index.month])
选项 1
pd.merge_asof
pd.merge_asof(df_1, df_2, left_index=True, right_index=True)
value_1 value_2
DatetimeIndex
2015-07-18 10 100
2015-07-18 11 100
2015-07-19 12 100
2015-07-20 13 100
2015-07-20 14 100
2015-07-20 15 100
2015-07-21 16 100
2015-07-22 17 100
2015-07-22 18 100
2015-07-23 19 100
2015-08-11 20 200
选项 2
指数操纵
df_1.set_index(
df_1.index - pd.offsets.MonthBegin()
).join(df_2).set_index(df_1.index)
value_1 value_2
DatetimeIndex
2015-07-18 10 100
2015-07-18 11 100
2015-07-19 12 100
2015-07-20 13 100
2015-07-20 14 100
2015-07-20 15 100
2015-07-21 16 100
2015-07-22 17 100
2015-07-22 18 100
2015-07-23 19 100
2015-08-11 20 200
这个问题在概念上类似于
我有两个 DataFrame。一个有一组对应于特定时间和日期的值 (df_1
)。另一个具有一组对应于特定月份 (df_2
) 的值,指定为一个月第一天的第一个时刻(例如 2015-07-01 00:00:00.00)。我想合并这些 DataFrame,以便 df_2
月份的值应用于相应月份的 df_1
的所有日期和时间。
所以,这里是 df_1
:
|DatetimeIndex|value_1|
|-------------|-------|
|2015-07-18 |10 |
|2015-07-18 |11 |
|2015-07-19 |12 |
|2015-07-20 |13 |
|2015-07-20 |14 |
|2015-07-20 |15 |
|2015-07-21 |16 |
|2015-07-22 |17 |
|2015-07-22 |18 |
|2015-07-23 |19 |
|2015-08-11 |20 |
这里是 df_2
:
|DatetimeIndex|value_2|
|-------------|-------|
|2015-07-01 |100 |
|2015-08-01 |200 |
我想像这样合并它们:
|DatetimeIndex|value_1|value_2|
|-------------|-------|-------|
|2015-07-18 |10 |100 |
|2015-07-18 |11 |100 |
|2015-07-19 |12 |100 |
|2015-07-20 |13 |100 |
|2015-07-20 |14 |100 |
|2015-07-20 |15 |100 |
|2015-07-21 |16 |100 |
|2015-07-22 |17 |100 |
|2015-07-22 |18 |100 |
|2015-07-23 |19 |100 |
|2015-08-11 |20 |200 |
因此,value_2
存在于每个月。
如何完成合并?
根据之前的回答,以下(有缺陷的)形式的解决方案似乎是正确的方法,但它失败了:
idx = df_1.index.union(df_2.index)
#df_1.join(df_2.loc[idx.date].set_index(idx), how = "outer")
df_1.join(df_2.loc[idx.month].set_index(idx), how = "outer")
只需使用合并
pd.merge(df_1.reset_index(), df_2, left_on=[df_1.index.year, df_1.index.month],
right_on=[df_2.index.year, df_2.index.month])
选项 1
pd.merge_asof
pd.merge_asof(df_1, df_2, left_index=True, right_index=True)
value_1 value_2
DatetimeIndex
2015-07-18 10 100
2015-07-18 11 100
2015-07-19 12 100
2015-07-20 13 100
2015-07-20 14 100
2015-07-20 15 100
2015-07-21 16 100
2015-07-22 17 100
2015-07-22 18 100
2015-07-23 19 100
2015-08-11 20 200
选项 2
指数操纵
df_1.set_index(
df_1.index - pd.offsets.MonthBegin()
).join(df_2).set_index(df_1.index)
value_1 value_2
DatetimeIndex
2015-07-18 10 100
2015-07-18 11 100
2015-07-19 12 100
2015-07-20 13 100
2015-07-20 14 100
2015-07-20 15 100
2015-07-21 16 100
2015-07-22 17 100
2015-07-22 18 100
2015-07-23 19 100
2015-08-11 20 200