2016-06-03 3 views
1

Я получил следующий ненормированный список кортежей в результате SQL-запроса.Группируйте список кортежей с идентичным кортежем (timestamp) с python itertools

data = [(...) {u'timestamp': datetime.datetime(2016, 5, 25, 23, 55, 33), u'sensor': u'GP_PRES', u'value': u'96587'}, {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_NO2', u'value': u'0.221'}, {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_TC', u'value': u'14.600'}, {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_HUM', u'value': u'83.94'}, (...) ] 

Это данные датчиков от нескольких датчиков, но с одинаковой меткой времени.

Я хотел бы сгруппировать все значения датчиков с одинаковой меткой времени. Так что у меня есть список кортежей на каждую равную метку времени.

grouped_data = [... {u'timestamp': datetime.datetime(2016, 5, 25, 23, 55, 33), [{u'sensor': u'GP_PRES', u'value': u'96587'}, { u'sensor': u'GP_NO2', u'value': u'0.221'}, {u'sensor': u'GP_TC', u'value': u'14.600'}, {u'sensor': u'GP_HUM', u'value': u'83.94'}]}, ... ] 

Я понял, что могу использовать функцию groupby() - из itertools. Я не понимаю, какую функцию Key мне нужно, чтобы группировать равную «метку времени».

data2 = sorted(data, key= operator.attrgetter('timestamp')) 
    for k, g in groupby(data2, keyfunc): 
      groups.append(list(g)) 

ответ

1

В коде operator.attrgetter('timestamp') вызывает ошибку AttributeError: 'dict' object has no attribute 'timestamp'.

Замените его на key=lambda d:d['timestamp'], как показано ниже.

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import itertools 
import operator 
import datetime 

data = [{u'timestamp': datetime.datetime(2016, 5, 25, 23, 55, 33), u'sensor': u'GP_PRES', u'value': u'96587'}, 
     {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_NO2', u'value': u'0.221'}, 
     {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_TC', u'value': u'14.600'}, 
     {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_HUM', u'value': u'83.94'}] 

groups = list() 
data2 = sorted(data, key=lambda d:d['timestamp']) 
for k, g in itertools.groupby(data2, key=lambda d:d['timestamp']): 
    groups.append(list(g)) 

print(groups) # 2 groups 
[[ {u'timestamp': datetime.datetime(2016, 5, 25, 23, 55, 33), u'sensor': u'GP_PRES', u'value': u'96587'}], 
[ {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_NO2', u'value': u'0.221'}, 
    {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_TC', u'value': u'14.600'}, 
    {u'timestamp': datetime.datetime(2016, 5, 25, 23, 56, 33), u'sensor': u'GP_HUM', u'value': u'83.94'}]] 
+0

Спасибо. Не могли бы вы объяснить использованную lamda-функцию? – Maus

+1

@Maus, выражения 'Lambda' используются для создания анонимных функций. Выражение лямбда-аргументов: выражение дает объект функции. Подробнее см. [Здесь] (https://docs.python.org/3/reference/expressions.html#lambda). – SparkAndShine

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