此问题在概念上类似于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")
答案 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)