Я изменил исходный кадр данных, добавив строки, повторяющие часы, с разными минутами. Вот мой стартовый фрейм данных:
timestamp id_device value
0 2019-11-04 14:00:10.432783 device1 3000
1 2019-11-04 14:00:03.946156 device1 4000
2 2019-11-04 12:20:03.946156 device1 6000
3 2019-11-04 11:11:03.940150 device1 1500
4 2019-11-04 11:19:03.946156 device1 1000
5 2019-11-04 10:19:03.946156 device1 4000
6 2019-11-04 09:19:03.946156 device2 1000
7 2019-11-04 08:19:03.946156 device2 4000
8 2019-11-04 08:22:01.946156 device2 2000
Вы заметите, что я трансформировал фрейм данных много раз и использовал разные имена. Это потому, что я не люблю перезаписывать исходные данные (в случае отступления)
Первая копия - это dataframe df2, для операций datetime. Мое намерение состоит в том, чтобы иметь возможность группировать по id_device и часам.
import datetime
df2['timestamp'] = pd.to_datetime(df2['timestamp']) # make sure it's datetime formatted
df2['hour'] = df['timestamp'].dt.floor('h') # last useful data
df2.drop(['timestamp'], axis=1) # get rid off timestamp
#groupby and mean delivered to dataframe df_result
df_result = df2.groupby(['hour','id_device'])['value'].mean().reset_index(name='mean')
hour id_device mean
0 2019-11-04 08:00:00 device2 3000
1 2019-11-04 09:00:00 device2 1000
2 2019-11-04 10:00:00 device1 4000
3 2019-11-04 11:00:00 device1 1250
4 2019-11-04 12:00:00 device1 6000
5 2019-11-04 14:00:00 device1 3500
Первое значение не имеет предыдущего значения для вычитания, поэтому оно равно 0. Если вы предпочитаете, вы можете сохранить значения в объекте списка, вВ этом случае вычтите.
deduct = []
for i in range(len(df_result.index)):
if i == 0:
print(0)
#deduct.append(0)
else:
print(df_result['mean'][i]-df_result['mean'][i-1])
#deduct.append(df_result['mean'][i]-df_result['mean'][i-1])
Выход:
0
-2000
3000
-2750
4750
-2500