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

#python #pandas #average #minute #pandas-groupby

#python #pandas #среднее #минута #pandas-groupby

Вопрос:

Итак, у меня есть фрейм данных pandas с именем ‘df’, и я хочу удалить секунды и просто иметь индекс в формате ГГГГ-ММ-ДД ЧЧ: ММ. Но затем также группируются минуты и отображается среднее значение за эту минуту.

Итак, я хочу превратить этот фрейм данных

                         value
2015-05-03 00:00:00     61.0
2015-05-03 00:00:10     60.0
2015-05-03 00:00:25     60.0
2015-05-03 00:00:30     61.0
2015-05-03 00:00:45     61.0
2015-05-03 00:01:00     61.0
2015-05-03 00:01:10     60.0
2015-05-03 00:01:25     60.0
2015-05-03 00:01:30     61.0
2015-05-03 00:01:45     61.0
2015-05-03 00:02:00     61.0
2015-05-03 00:02:10     60.0
2015-05-03 00:02:25     60.0
2015-05-03 00:02:40     60.0
2015-05-03 00:02:55     60.0
2015-05-03 00:03:00     59.0
2015-05-03 00:03:15     59.0
2015-05-03 00:03:20     59.0
2015-05-03 00:03:35     59.0
2015-05-03 00:03:40     60.0
  

в этот фрейм данных

                         value
2015-05-03 00:00        60.6
2015-05-03 00:01        60.6
2015-05-03 00:02        60.2
2015-05-03 00:03        59.2
  

я пробовал код, подобный

 df['value'].resample('1Min').mean()
  

или

 df.index.resample('1Min').mean()
  

но, похоже, это не работает. Есть идеи?

Комментарии:

1. Для меня это работает отлично. Вы получаете какую-то ошибку?

2. df.index.resample(‘1Min’).mean() выдает ошибку AttributeError: объект ‘DatetimeIndex’ не имеет атрибута ‘resample’, а df[‘value’].resample(‘1Min’).mean() не выдает ошибку, но и не дает желаемого результата, ничего не меняется, я не получаю средних значений, а секунды все еще там

Ответ №1:

Сначала вам нужно преобразовать индекс в DatetimeIndex :

 df.index = pd.DatetimeIndex(df.index)
#another solution
#df.index = pd.to_datetime(df.index)

print (df['value'].resample('1Min').mean())
#another same solution
#print (df.resample('1Min')['value'].mean())
2015-05-03 00:00:00    60.6
2015-05-03 00:01:00    60.6
2015-05-03 00:02:00    60.2
2015-05-03 00:03:00    59.2
Freq: T, Name: value, dtype: float64
  

Другое решение с установлением значений секунд в индексе на 0 by astype :

 print (df.groupby([df.index.values.astype('<M8[m]')])['value'].mean())
2015-05-03 00:00:00    60.6
2015-05-03 00:01:00    60.6
2015-05-03 00:02:00    60.2
2015-05-03 00:03:00    59.2
Name: value, dtype: float64
  

Комментарии:

1. У меня уже есть df.index = df.index.to_datetime() в моем коде, разве это не преобразуется в datetimeindex?

2. Вы пытаетесь df.index = pd.to_datetime(df.index) ?

3. итак, код, который я действительно хотел, был df = df[‘value’].повторная выборка (‘1Min’).mean(), спасибо, примет ваш ответ через 4 минуты!

4. Рад, что могу вам помочь. df.resample('1Min')['value'].mean() то же самое df['value'].resample('1Min').mean() , что я добавляю его в ответ.

5. @ak3191 — Я думаю, для построения графика это не обязательно, используйте s = df.groupby([df.index.values.astype('<M8[m]')])['value'].mean() и s.plot() . Но если хотите DataFrame использовать rint (df.groupby([df.index.values.astype('<M8[m]')])['value'].mean().reset_index())