Вы можете использовать
diffs = df.groupby(['Device'])['Timestamp'].diff()
# In [39]: diffs
# Out[39]:
# 0 NaT
# 1 00:00:31
# 2 NaT
# 3 00:00:01
# 4 00:00:29
# 5 00:00:32
# 6 00:01:47
# 7 00:02:59
# dtype: timedelta64[ns]
вычислить разницу между последовательными метками времени для каждой группы устройств. Обратите внимание, что это зависит от временных меток, находящихся в отсортированном порядке (по крайней мере, в каждой группе Device
). Если это не так, конечно, может сортировать строки по Timestamp
первым (например, df = df.sort('Timestamp')
)
Затем создайте булево маску, чтобы найти, когда разница составляет более 60 секунд:
df['gap'] = diffs > pd.Timedelta(seconds=60)
# In [42]: df['gap']
# Out[42]:
# 0 False
# 1 False
# 2 False
# 3 False
# 4 False
# 5 False
# 6 True
# 7 True
# Name: gap, dtype: bool
Для каждого устройства , мы можем использовать cumsum
для вычисления суммарной суммы df['gap']
.
df['group'] = df.groupby(['Device'])['gap'].cumsum()
# In [45]: df['group']
# Out[45]:
# 0 0
# 1 0
# 2 0
# 3 0
# 4 0
# 5 0
# 6 1
# 7 1
# Name: group, dtype: int64
Так как Ложные трактуется как 0 и Истинный трактуется как 1, накопленная сумма чисел в строках эффекта в пределах каждого устройства-группы, которые принадлежат одному и тому же гэп-группы.
Теперь мы можем GroupBy оба Device
и group
столбцов и найти первый и последний Timestamp
и среднее Value
внутри каждой группы:
result = df.groupby(['Device', 'group']).agg(
{'Timestamp': ['first','last'], 'Value':'mean'}):
# Timestamp Value
# first last mean
# Device group
# 30:8c:fb:a4:b9:8b 0 2015-10-26 22:50:15 2015-10-26 22:51:47 33.5
# 1 2015-10-26 22:54:46 2015-10-26 22:54:46 34.0
# c0:ee:fb:35:ec:cd 0 2015-10-26 22:50:50 2015-10-26 22:50:51 32.5
# 1 2015-10-26 22:52:38 2015-10-26 22:52:38 38.0
Собираем все вместе:
import pandas as pd
df = pd.DataFrame(
{'Device': {0: '30:8c:fb:a4:b9:8b',
1: '30:8c:fb:a4:b9:8b',
2: 'c0:ee:fb:35:ec:cd',
3: 'c0:ee:fb:35:ec:cd',
4: '30:8c:fb:a4:b9:8b',
5: '30:8c:fb:a4:b9:8b',
6: 'c0:ee:fb:35:ec:cd',
7: '30:8c:fb:a4:b9:8b'},
'Timestamp': {0: pd.Timestamp('2015-10-26 22:50:15'),
1: pd.Timestamp('2015-10-26 22:50:46'),
2: pd.Timestamp('2015-10-26 22:50:50'),
3: pd.Timestamp('2015-10-26 22:50:51'),
4: pd.Timestamp('2015-10-26 22:51:15'),
5: pd.Timestamp('2015-10-26 22:51:47'),
6: pd.Timestamp('2015-10-26 22:52:38'),
7: pd.Timestamp('2015-10-26 22:54:46')},
'Value': {0: 34, 1: 34, 2: 33, 3: 32, 4: 34, 5: 32, 6: 38, 7: 34}})
diffs = df.groupby(['Device'])['Timestamp'].diff()
df['gap'] = diffs > pd.Timedelta(seconds=60)
df['group'] = df.groupby(['Device'])['gap'].cumsum()
result = df.groupby(['Device', 'group']).agg({'Timestamp': ['first','last'], 'Value':'mean'})
print(result)
Прекрасно работает! Я уже пробовал и это точный результат, который я искал, спасибо за подход –