У меня есть ряд данных измерений/временных рядов в том же интервале 15 минут. Кроме того, у меня есть заданный период (например, один день, текущая неделя, месяц, год, (...), и мне нужно суммировать значения по часам, дням, месяцам, (...).
Например. суммировать все значения за последний месяц по дням.
Мой подход заключается в создании временного массива с необходимым интервалом за период на первом этапе. Например. здесь, в PHP (PHP не так уж необходим, я бы предпочел Python или Javascript, если он обеспечивает более быстрый метод)
$this->tempArray = array(
'2014-10-01T00:00:00+0100' => array(),
'2014-10-02T00:00:00+0100' => array(),
'2014-10-03T00:00:00+0100' => array(),
'2014-10-04T00:00:00+0100' => array(),
(...)
'2014-10-31T00:00:00+0100' => array()
);
На втором этапе я перебираю каждую пару дата/значение (в этом примере 4*24*31, (96 в день)) и назначаю их моему временному массиву. Для каждой даты я переопределяю некоторые значения из объекта datetime. В этом примере часы и минуты соответствуют ключам в массиве temp.
$insert = array(
'datetime' => $datetime,
'value' => $value
);
if ($interval == "d") {
$this->tempArray[date('Y-m-d\T00:00:sO', $datetime)][] = $insert;
}
На последнем шаге я перебираю временный массив и суммирую каждый массив. В результате я получаю массив с 31 новой парой дата/значение, суммированной по дням. Это прекрасно работает. Однако есть ли более быстрый способ или более эффективный способ? При таком подходе в течение одного месяца требуется почти 0,5 секунды. (Если кого-то заинтересует исходный код, я добавлю суть). Данные хранятся в базе данных mysql с 15 миллионами записей.
// Редактировать: я думаю, что лучше всего сгруппировать это с помощью mysql.
Мой текущий SQL-запрос для получения данных за один год:
SELECT
FROM_UNIXTIME(PointOfTime)) as `date`,
value
FROM data
WHERE EnergyMeterId="0ca64479-bddf-4b91-9e35-bf81f4bfa84c"
and PointOfTime >= unix_timestamp('2013-01-01T00:00:00')
and PointOfTime <= unix_timestamp('2013-12-31T23:45:00')
order by `date` asc;
between
и получать только то, что вам действительно нужно. - person dognose   schedule 07.10.2014