如何合并DataFrames,使得对应于* months *的一个值被应用于另一个* datetimes *?

时间:2017-10-10 16:42:40

标签: pandas datetime merge datetimeindex

此问题在概念上类似于this one

我有两个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")

2 个答案:

答案 0 :(得分: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])

答案 1 :(得分:2)

选项1
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

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

选项2
索引操作

 let formatter = DateFormatter()
 formatter.dateFormat = "h:mm a"
 displayTime = formatter.string(from: timePicker.date)
 formatter.dateFormat = "H"
 let hour = formatter.string(from: timePicker.date)
 print(hour)