2

同じ15分間隔で一連の測定データ/時系列があります。さらに、特定の期間があります (たとえば、1 日、現在の週、月、年 (...)、時間、日、月 (...) ごとに値を要約する必要があります)。

たとえば、先月のすべての値を日別に集計します。

私のアプローチは、最初のステップで期間ごとに必要な間隔で一時的な配列を生成することです。たとえば、ここでは 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()
);

2 番目のステップでは、各日付と値のペア (この例では 4*24*31 (1 日あたり 96)) をループ処理し、それらを一時配列に割り当てます。日付ごとに、datetime オブジェクトの値をいくつかオーバーライドします。この例では、一時配列のキーと一致する時間と分。

$insert = array(
    'datetime' => $datetime,
    'value' => $value
);

if ($interval == "d") {

    $this->tempArray[date('Y-m-d\T00:00:sO', $datetime)][] = $insert;
}

最後のステップで、一時配列をループして、各配列を要約します。その結果、日ごとに要約された 31 個の新しい日付/値のペアを含む配列を受け取ります。これはうまくいきます。しかし、より速い方法またはより効率的な方法はありますか? このアプローチでは、1 か月で約 0.5 秒かかります。(誰かがソースコードに興味を持っている場合は、要点を追加します)。データは 15 mio のエントリを持つ mysql データベース内に保存されます。

// 編集: これを mysql でグループ化するのが最善の方法だと思います。

1 年からデータを取得するための現在の 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;
4

1 に答える 1