Я хочу объединить два набора данных, которые проиндексированы time
и id
.Проблема в том, что время немного отличается в каждом наборе данных.В одном наборе данных время (Ежемесячно) - середина месяца, то есть 15 числа каждого месяца.В другом наборе данных это последний рабочий день.Это должно быть однозначное совпадение, но даты не совпадают.
Мой подход заключается в переносе дат в середине месяца на даты в конце рабочего дня.
Данные:
dt = pd.date_range('1/1/2011','12/31/2011', freq='D')
dt = dt[dt.day == 15]
lst = [1,2,3]
idx = pd.MultiIndex.from_product([dt,lst],names=['date','id'])
df = pd.DataFrame(np.random.randn(len(idx)), index=idx)
df.head()
вывод:
0
date id
2011-01-15 1 -0.598584
2 -0.484455
3 -2.044912
2011-02-15 1 -0.017512
2 0.852843
Это то, что я хочу (я убрал предупреждение о производительности):
In[83]:df.index.levels[0] + BMonthEnd()
Out[83]:
DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31', '2011-04-29',
'2011-05-31', '2011-06-30', '2011-07-29', '2011-08-31',
'2011-09-30', '2011-10-31', '2011-11-30', '2011-12-30'],
dtype='datetime64[ns]', freq='BM')
Однако индексы являются неизменяемыми, поэтому это не работает:
In: df.index.levels[0] = df.index.levels[0] + BMonthEnd()
TypeError: 'FrozenList' does not support mutable operations.
Единственное решение, которое у меня есть, - это reset_index (), изменить даты, затем снова установить set_index ():
df.reset_index(inplace=True)
df['date'] = df['date'] + BMonthEnd()
df.set_index(['date','id'], inplace=True)
Это дает то, что я хочу, но это лучший способ?Есть ли функция set_level_values () (я не видел ее в API)?
Или, может быть, я использую неправильный подход к слиянию.Я мог бы объединить набор данных с ключами df.index.get_level_values(0).year
, df.index.get_level_values(0).month
и id
, но это не намного лучше.