2016-08-17 5 views
1

温度/湿度センサーからのログデータを含むcsvファイルがあります。 行がある:日付/時間 - 温度 - 湿度\tデリミタ)ログファイルからのスパイクとローを除去する

2016-07-21 17:39 36.8 30.4 
2016-07-21 17:40 4.7  30.5 
2016-07-21 17:41 36.7 30.9 
2016-07-21 17:42 36.7  1.9 

この例では、17:40(温度)午前17時42分(湿度)

における測定誤差を示します

私はファイルをループして、それらのエラーを見つけて、すべての有効なデータと1つのエラーで1つのファイルを作成したいと思います。

私のアプローチ: 行ごとに反復し、現在の温度または湿度の値が前の行の値から5℃/%を超えるかどうかを確認します。 (測定誤差は通常の温度/湿度から極端に偏差があります) データは対応する辞書に書き込まれ、csvファイルに書き込まれます。

import csv 
good_data ={} # Dictionary for valid Data 
bad_data ={} # Dictionary for invalid Data 

with open("path/Logger.csv","r") as f: 
    f_reader = csv.reader(f,delimiter="\t",dialect='excel-tab') 
    prev_temp = None 
    prev_hum = None 
    for row in f_reader: 
     temp = float(row[1]) 
     hum = float(row[2]) 
     if prev_temp is not None and prev_hum is not None: 
      if temp < prev_temp - 5.0 or temp > prev_temp + 5.0 or hum < prev_hum - 5.0 or hum > prev_hum + 5.0 : 
        bad_data[row[0]] = row[1:] 
        prev_temp = prev_temp 
        prev_hum = prev_hum 
      else: 
       good_data[row[0]] = row[1:] 
       prev_temp = temp 
       prev_hum = hum 
     else: 
      prev_temp = temp 
      prev_hum = hum 

質問1: noobのスクリプトをそれ `sが、それは動作します。ここ

は、コード(のpython 3)があります。 私の問題は、時々、ロギングプロセスが、このようなログファイルをもたらした停止したことを、次のとおりです。

2016-07-21 12:00 36.8 30.4 
2016-07-21 21:30 16.7 30.5 
2016-07-21 21:31 16.7 30.9 

ので、その場合には、行の比較によって行は、温度や湿度まで21時30分からすべてを排除するであろうもう一度12:00に近づいてください。

だから私はこれに対するより精巧なアプローチに関するいくつかのアドバイスを感謝します。

エッジケースについて:ラズベリーパイ24/7でTemp/Humを記録しています。最初の値はokです:-)エッジとローは、センサーエラーのため、1日を通して約2回発生します。私が知る限り、これはDHT22 Temp/Hum Sensorのバグです。

答えて

0

最初の値がスパイクまたはローのエッジのケースは考慮していないようです。

値が一定の範囲[16-38]の範囲内にあるようですが、分単位で値を記録すると温度や湿度の急激な変化は起こりにくいですが、+ 5度になることがあります。

精巧なアプローチ: 前日のデータから特定の範囲を見つけ、平均、平均、偏差を計算して良好な範囲関数を推定する。

関連する問題