2015-11-30 4 views
0

Мне нужно сгруппировать записи, в которых разница между метками времени между одним и другим составляет X секунд или меньше, чем среднее значение для каждого из них для каждого из них устройств. В следующем примере у меня есть Data Frame с этими данными, и мне нужно группировать по устройству с записями между 60 секундами друг от друга.Группа DataFrame по записям X количество времени друг от друга

   Device   Timestamp Value 
0 30:8c:fb:a4:b9:8b 10/26/2015 22:50:15  34 
1 30:8c:fb:a4:b9:8b 10/26/2015 22:50:46  34 
2 c0:ee:fb:35:ec:cd 10/26/2015 22:50:50  33 
3 c0:ee:fb:35:ec:cd 10/26/2015 22:50:51  32 
4 30:8c:fb:a4:b9:8b 10/26/2015 22:51:15  34 
5 30:8c:fb:a4:b9:8b 10/26/2015 22:51:47  32 
6 c0:ee:fb:35:ec:cd 10/26/2015 22:52:38  38 
7 30:8c:fb:a4:b9:8b 10/26/2015 22:54:46  34 

Это должно быть Результирующие DataFrame

   Device   First_seen   Last_seen Average_value 
0 30:8c:fb:a4:b9:8b 10/26/2015 22:50:15 10/26/2015 22:51:47   33,5 
1 c0:ee:fb:35:ec:cd 10/26/2015 22:50:50 10/26/2015 22:50:51   32,5 
2 c0:ee:fb:35:ec:cd 10/26/2015 22:52:38 10/26/2015 22:52:38   38 
3 30:8c:fb:a4:b9:8b 10/26/2015 22:54:46 10/26/2015 22:54:46   34 

Я пытался использовать timeGrouper, но я не был в состоянии добраться до рабочего раствора. Большое спасибо за Вашу помощь.

ответ

1

Вы можете использовать

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) 
+0

Прекрасно работает! Я уже пробовал и это точный результат, который я искал, спасибо за подход –

Смежные вопросы