1

这个问题在概念上与这个问题相似

我有两个数据框。一个有一组对应于特定时间和日期的值 ( 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")
4

2 回答 2

2

只需使用合并

      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])
于 2017-10-10T17:02:04.897 回答
2

选项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
于 2017-10-10T17:04:03.950 回答