Панды переиндексируют мультииндекс и сдвигают значения по второму индексу

1

У меня есть pandas DataFrame, который выглядит так:

                        x1             x2            x3            x4
Date       Time                                                               
2017-01-03 09:00:00      0.000097      0.000259      0.000629      0.000142   
           09:20:00      0.000046      0.000044      0.000247      0.000134   
           09:40:00      0.000021      0.000032      0.000171      0.000105   
           10:00:00      0.000033      0.000040      0.000136      0.000178   
           10:20:00      0.000079      0.000157      0.000094      0.000083
           .....
           17:00:00      0.000032      0.000137      0.000024      0.000028

Тем не менее, я хочу переиндексировать второй индекс, на один 20-минутный bin, и я бы хотел, чтобы он выглядел следующим образом:

                        x1             x2            x3            x4
Date       Time                                                               
2017-01-03 09:20:00      0.000097      0.000259      0.000629      0.000142   
           09:40:00      0.000046      0.000044      0.000247      0.000134   
           10:00:00      0.000021      0.000032      0.000171      0.000105   
           10:20:00      0.000033      0.000040      0.000136      0.000178   
           10:40:00      0.000079      0.000157      0.000094      0.000083
           .....
           17:20:00      0.000032      0.000137      0.000024      0.000028

Таким образом, все значения остаются неизменными, только второй индекс переименовывается, все остальное остается неизменным.

Я пробовал следующий код:

x.reindex(pd.date_range(pd.Timestamp('09:20:00'), pd.Timestamp('17:20:00'), freq="20min").time, level=1)

Но он просто перемещает индекс, а значения остаются на одном месте.

                        x1             x2            x3            x4
Date       Time                                                               
2017-01-03 09:20:00      0.000046      0.000044      0.000247      0.000134   
           09:40:00      0.000021      0.000032      0.000171      0.000105   
           10:00:00      0.000033      0.000040      0.000136      0.000178   
           10:20:00      0.000079      0.000157      0.000094      0.000083
           .....
           17:00:00      0.000032      0.000137      0.000024      0.000028

Это даже не в корзину для 17:20:00.

Однако, если я также попытался сдвинуть значения после их группировки следующим образом:

x.groupby(level=1).shift(1)

или же:

x.groupby(level=1).shift(1, freq='20min')

но это совсем не сработало.

Теги:
pandas
multi-index

1 ответ

3
Лучший ответ

Самый быстрый способ, о котором я могу думать, - перезаписать весь первый уровень (самый внутренний уровень) MultiIndex с самой 20-минутной версией самого себя:

x.index = x.index.set_levels(x.index.levels[1].shift(20, 'min'), level=1)

пример

x = pd.DataFrame(index=pd.MultiIndex.from_product([pd.date_range('2017-01-03', '2017-01-06', freq='1D'), 
                                                   pd.date_range('09:00', '17:00', freq='20min')]))
x.loc[:, 'x1'] = list(range(len(x)))

x
                                x1
2017-01-03 2018-06-14 09:00:00   0
           2018-06-14 09:20:00   1
           2018-06-14 09:40:00   2
           2018-06-14 10:00:00   3
           2018-06-14 10:20:00   4
    ...                         ..
2017-01-06 2018-06-14 15:40:00  95
           2018-06-14 16:00:00  96
           2018-06-14 16:20:00  97
           2018-06-14 16:40:00  98
           2018-06-14 17:00:00  99

x.index = x.index.set_levels(x.index.levels[1].shift(20, 'min'), level=1)

x
                                x1
2017-01-03 2018-06-14 09:20:00   0
           2018-06-14 09:40:00   1
           2018-06-14 10:00:00   2
           2018-06-14 10:20:00   3
           2018-06-14 10:40:00   4
    ...                         ..
2017-01-06 2018-06-14 16:00:00  95
           2018-06-14 16:20:00  96
           2018-06-14 16:40:00  97
           2018-06-14 17:00:00  98
           2018-06-14 17:20:00  99
  • 0
    Спасибо Петру, что сработало для меня :).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню