2017-08-15 79 views
-1

我在我保存的日期時間,pH和溫度的數據文件。偶爾,溫度會丟失一位數字,如下所示:刪除峯線

12-08-2017_14:52:21 Temp: 28.9 pH: 7.670 
12-08-2017_14:52:42 Temp: 28.9 pH: 7.672 
12-08-2017_14:53:03 Temp: 28.9 pH: 7.672 
12-08-2017_14:53:24 Temp: 8.91 pH: 7.667 
12-08-2017_14:53:45 Temp: 28.9 pH: 7.667 
12-08-2017_14:54:06 Temp: 28.9 pH: 7.669 
12-08-2017_14:54:27 Temp: 28.9 pH: 7.671 

我想刪除整行錯誤。 我已經找到了一些解決方案,如this,但我不知道如何實現它的蟒蛇。有沒有我應該這樣做,無論是在Python或bash任何具體的方式?

+0

你可以使用一些oultier檢測過程,這樣https://stackoverflow.com/questions/11686720/is-there-a-numpy-builtin-to-reject-outliers-from-a- list – DyZ

+0

你能更準確地描述「錯誤」情況嗎?良好的溫度總是會有兩位數字?從不大於99?負? –

回答

1

這取決於你想要的行爲和所需要的解決方案的複雜很多。根據您發佈的數據,我會說您可以嘗試計算與上次測量值的差異,並拒絕與上一次測量值相差超過threshold度的測量值。這只是一個快速和骯髒的例子:

THRESHOLD = 10 
lastTemp = None 

while True: 
    line = raw_input().split() 
    temp = float(line[2]) 

    if not lastTemp: 
     lastTemp = temp 

    if abs(temp - lastTemp) > THRESHOLD: 
     continue 

    # Process the line here 
    print line 

這跳過與前一個10度不同的測量線。如果測量是在足夠小的時間間隔取出並沒有大的溫度變化預計它是合適的。

對此的一個小改進是考慮最近的幾次測量,計算下一次測量的預測值(如果只考慮2次,只需做一次微分 - 對於更多點,需要更復雜的方法),拒絕如果該值離預測太遠。或者,可以使用更復雜的統計方法。

0

根據您的實際數據的複雜程度,一個簡單的awk的解決辦法是:

awk '$3 >= 10 {print}' data 

當中,對你的樣本數據,返回:

12-08-2017_14:52:21 Temp: 28.9 pH: 7.670 
12-08-2017_14:52:42 Temp: 28.9 pH: 7.672 
12-08-2017_14:53:03 Temp: 28.9 pH: 7.672 
12-08-2017_14:53:45 Temp: 28.9 pH: 7.667 
12-08-2017_14:54:06 Temp: 28.9 pH: 7.669 
12-08-2017_14:54:27 Temp: 28.9 pH: 7.671 

如果你的溫度可能是負的,如這些樣本添加:

12-08-2017_14:54:27 Temp: -28.9 pH: 7.671 
12-08-2017_14:54:27 Temp: -2.9 pH: 7.671 

然後擴大awk t斯:

awk '$3 >= 10 || $3 <= -10 {print}' data