2016-06-27 5 views
1

私は温度データのテーブルを持っており、複数のセンサーで5-15分ごとに更新されています。 データは本質的にユニークなID、デバイス(センサID)、タイムスタンプ、値(フロート) です。センサには正確なクロックがないため、時間の経過とともに読み値が歪んでしまいます。 mysqlの時間ごとにグループ化して、温度データの最後の24時間を読み込みます。 PHPプログラマーとしての私の解決策は、処理されていないすべての読みを読み込んでテーブルに「結合」するプリプロセッサを作ることです。 x-minute/hourを1時間に1つ読んで、グラフを使って使うようにする必要がある私以外の人がいなければなりません。MySQLの不規則な時系列データを通常のシーケンスに変換する

私の問題は、1つまたは複数の読み値から丸め時間値を計算する方法です。

たとえば、私は2.5時間に12回の読みを持っています。これらの読みには1時間ごとに明示的な値が必要です。

データ:

Date     Device Value 
2016-06-27 12:15:15, TA,  23.5 
2016-06-27 12:30:19, TA,  23.1 
2016-06-27 12:45:35, TA,  22.9 
2016-06-27 13:00:55, TA,  22.5 
2016-06-27 13:05:15, TA,  22.8 
2016-06-27 13:35:35, TA,  23.2 

私は統計数学にそのあまりないんだけど、その「標準偏差」と同類は私のためにロシアの市内です。

また、デバイスは時々スリープ状態になり、必ずしも温度を送信するとは限りません。

質問に情報を追加するように私に依頼してください。私は皆さんがこれに答える必要があるかどうか分かりません。

最も重要な部分は次のとおりです。 1.私はMySQLを使用していますが、それは変更されません。 2.私はPHPで解決策(またはヒント)を望んでいますが、他の多くの言語のヒントも私の理解に役立ちます。私は主にPHPプログラマですので、その言語の回答が最も高く評価されます。

編集:私はいくつかのポイントを指定したいと思います。 センサーから記録された時間データが不正確な場合があるため、私はSQLの挿入時間に頼っています。そのようにして、時間は1つのデバイスだけで制御され、コントローラはデータを挿入します。

たとえば、私が24時間に30個のタイムスタンプと値のペアを選択した場合、それらを24個のタイムスタンプ/値のペアに「結合」し、オーバーフローしたデータを結合する平均を使用したいと思います。 私はそれを説明するのは良いことではありませんが、これでより明確になることを願っています。

また、それを行うためのきれいなSQLの方法だけでなく、30行をループして24時間のデータ行を生成するPHPの方法も大好きです。

私の目標は、正確なタイムスタンプと温度値で、1時間に1つの行を持つことです。主に、ほとんどのグラフ作成ライブラリがそのような入力を期待しているからです。特にグラフに複数のシリーズがある場合。

ある時点で、過去6時間と15分間の精度でグラフを表示すると便利な場合があります。

私は未処理のデータを変更したくないということを知り、単なる結果を抽出/計算する方法を見つけるだけです。

+0

広すぎると投票すると投票します。時間が正確でない場合は、データをどのように処理したいのですか? 「午後1時」のグループでは「13:00:55」の値がカウントされるか、またはクロックが56秒遅れて実際には「午後12時」になるのでしょうか?おそらくあなたのセンサーが読書を取ったときのことをあなたのセンサーが伝えたなら、あなたはdbに入る前に正常化することができます。 「ええと、午後12時03分だと言ったが、実際は12時04分だから、センサーが1分遅れる」 –

+0

@Bobセンサからデータを取得する際に、timesampカラムの[automatic initialization](http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html)を使用することができます。この方法では、センサからの時間データを無視することができます。 – postrel

+0

問題は、タイムスタンプ11:55:00の読み取り値と、タイムスタンプ12:05:00の読み取り値が得られた場合、その2つの平均値を12:00:00として計算したいと思います。私のグラフでそれを使用する。明らかに、希望のタイムスタンプ(12:00:00)の両側に値がない場合、これは機能しませんが、新しい値が得られるまで「将来」の値は無視できます。それで、「11:55:00,16.6」と「12:05:00,16.8」を「12:00:00,16.7」(可愛い数字を使用)に変換する方法は、後の「数式」です – Bob

答えて

0

これを処理する方法は、次のとおりです。

開始日の開始値。 01/01/2016 00:00:00を実行して、MySQLの 'between' 'sql'を実行し、毎時間実行します。したがって、最初の 'sql'は次のようになります。

'01/01/1616 00:00:00から01/01/2016 00:59:99の間の日付を選択し、1時間ごとに進捗するテーブルから平均(temp_value)を選択します。

sqlが正しくないため、24時間全体をプログラムで書き出すことができますが、これはあなたのやり方で始まると思います。

+0

24時間クエリのために1時間ごとに1つのSQLが必要になりますが、私は長い範囲を得るために巧妙なグループ分けを使えるようにしたいと考えていました1つのクエリで結果セット。 24時間クエリの結果をループして1時間ごとの値を持つ24個のアイテムの配列を生成するときに使用できる数式もあります。私はこれが非常に幅広いことを理解しています。誰かが助けてくれる何かの既存のコード例/ライブラリヒントを持っていない限り、私はこの答えを受け入れる準備ができています。私はおそらくそれを解決するためにいくつかの巧妙なプログラミングを行うことができますが、私はホイールを再発明したくありません;) – Bob

+0

これはヘルプサイトです、私は人々が準備ができているソリューションを持っているかどうかは疑問です。もしあなたがPHPを知っていれば、本当にそれほど難しいことではありません。準備が整ったソリューションが必要な場合は、elanceのようなサイトを使用してジョブを投稿することができます。それとも、私はムーアのために作ることができます。または、あなたがコードを開始し、あなたが立ち往生したときに助けを求めることができます。人々は賢明に生まれていない、彼らの意志は彼らを賢くする:) – bluepinto

関連する問題