Pandas частота повторной выборки в пределах уровня индекса - PullRequest
1 голос
/ 26 февраля 2020

В пределах Pandas я хотел бы повторно сэмплировать мой фрейм данных и взять среднее значение в течение 5 часов и в пределах уровня индекса. Мой фрейм данных выглядит так: df

            timestamp       width  length
name                                    
10    2019-08-01 00:00:00   10.1    86.1
10    2019-08-01 00:00:10   10.0    86.2
10    2019-08-01 00:05:40   10.1    86.3
10    2019-08-01 00:05:50   10.0    86.2
8     2019-08-01 00:05:54   12.0   110.0

Я хотел бы сохранить свою переменную name в качестве индекса (желательно без установки метки времени в качестве индекса), например:

            timestamp       width  length
name                                    
10    2019-08-01 00:00:05   10.05   86.15
10    2019-08-01 00:05:45   10.05   86.25
8     2019-08-01 00:05:54   12.0    110.0

Я пытался:

df_resample = df.resample('5H', on='timestamp').mean()

Но это не будет работать на уровне индекса. Также он устанавливает дату и время в индексе, которого я стараюсь избегать.

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

IIU C, вы можете использовать groupby и resample:

(df.groupby(level=0, sort=False)
   .resample('5min', on='timestamp').mean()
   .reset_index()
)

Это, однако, не усредняет ваши метки времени, так как вы не можете добавить Datetime тип в pandas, хотя есть способы обойти это.

   name           timestamp  width  length
0    10 2019-08-01 00:00:00  10.05   86.15
1    10 2019-08-01 00:05:00  10.05   86.25
2     8 2019-08-01 00:05:00  12.00  110.00

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

(df.assign(int_time=lambda x: x['timestamp'].astype('int64') )
   .groupby(level=0, sort=False)
   .resample('5min', on='timestamp').mean()
   .reset_index()
   .assign(timestamp=lambda x: x['int_time'].astype('int64').astype('datetime64[ns]'))
   .drop('int_time', axis=1)
)

Вывод:

   name           timestamp  width  length
0    10 2019-08-01 00:00:05  10.05   86.15
1    10 2019-08-01 00:05:45  10.05   86.25
2     8 2019-08-01 00:05:54  12.00  110.00
0 голосов
/ 26 февраля 2020

Установить временную метку в качестве индекса временно, затем восстановить sh исходный индекс.

df = df.reset_index().set_index('timestamp').resample('5H').mean().set_index('name')

Это то, что вы хотели получить?

...