2016-08-17 59 views
0

我有一個看起來像這樣的日誌文件:(日期/時間 - 溫度 - 溼度)計算平均值對於每一個小時,以消除高峯和低谷

2016-05-17 21:17 18.5 39.2 
2016-05-17 21:18 18.5 39.2 
2016-05-17 21:19 18.6 39.3 
2016-05-17 21:20 18.5 39.3 
2016-05-17 21:21 18.5 39.3 
2016-05-17 21:22 18.4 39.2 
2016-05-17 21:23 18.5 39.3 
2016-05-17 21:24 18.4 39.3 
2016-05-17 21:25 18.5 39.4 
2016-05-17 21:26 18.4 39.3 
2016-05-17 21:27 18.3 39.4 
2016-05-17 21:28 18.3 39.4 
2016-05-17 21:29 18.4 39.5 
2016-05-17 21:30 4.4 39.5 
2016-05-17 21:31 18.4 39.5 
2016-05-17 21:32 18.3 39.5 
2016-05-17 21:33 18.3 39.5 
2016-05-17 21:34 18.3 39.5 
2016-05-17 21:35 18.3 39.5 
2016-05-17 21:36 18.3 39.6 
2016-05-17 21:37 18.3 39.6 
2016-05-17 21:38 18.3 39.6 
2016-05-17 21:39 18.3 39.6 
2016-05-17 21:40 18.3 15.6 
2016-05-17 21:41 18.2 39.5 

我想消除顯示不正常的尖峯行和低點(錯誤的測量)。

我的方法:

用於每個小時,比這小時與平均內比較每個值

計算平均溫度和溼度值。如果「溫度」或「溼度」與平均值相差太遠,則整行被踢。

我可以用熊貓做這個嗎?

到目前爲止,我只得到了df的設置。

df = pd.read_csv('Logger.csv',delimiter="\t", names =['Timestamp', 'Temperature', 
'Humidity'],header=None, parse_dates=["Timestamp"], index_col="Timestamp").resample('H') 
.mean().dropna() 

所以我得到每小時的平均值。

問題:我可以使用大熊貓來比較每行的每個溫度和溼度值,並消除那些偏離計算平均值5°C或5%的值嗎?

編輯:所以我從日誌文件中發佈了更多信息,並在21:30和21:40「添加」了2個測量錯誤。這些測量誤差每天發生一次或兩次,這些都是我想消除的行。 數據通過Raspberry Pi和DHT22傳感器24小時/ 7天記錄(傳感器有一個導致錯誤測量的錯誤)

不太確定我理解你的問題。我想將良好的數據寫入一個新的.csv文件(good data.csv),並將錯誤的數據寫入一個不同的新的.csv文件(baddata.csv)。 對不起,如果我把你的問題寫錯了。

我喜歡計算日誌文件中每60分鐘的平均值,並比較逐行和相應小時的平均值。 有關頂部熊貓日誌例子給我:

     Temperature Humidity 
Timestamp         
2016-05-17 21:00:00  17.82 38.464 

所以我清理日誌將日期2016年5月17日,並在一小時內的每一個溫度值進行比較的想法21:00 - 22:00與17.82°C。 同樣我想用溼度做。

而這整個過程每天在日誌文件中每一小時。

如果我沒有說清楚,我很抱歉。

@凱爾:我想我可以在這種變化中玩一下。也許5°C有點縮小,但我認爲10°C可以做這項工作,也許10%溼潤。 日誌是在一個封閉的車庫,我認爲帽子應該工作。測量誤差我想擺脫常規測量值的相當大的免除。 @MaxU: 於是,我的代碼,但它沒有工作,我打它周圍來理解語法,這是我結束了:

logfile =pd.read_csv('/Users/Peter/Desktop/LearnPython/DataLoggerTEST.csv',header=None, delimiter="\t",names['Timestamp','Temperature','Humidity'],index_col=0,parse_dates='Timestamp') 

df=[logfile[['Temperature','Humidity']].groupby(pd.TimeGrouper('1H')).transform('mean').abs().query('Temperature > 5 and Humidity > 5').index] 

我得到的是每次mean值小時 輸出(摘錄):

Date/Time         
2016-05-17 21:17:00  17.82 38.464 
2016-05-17 21:18:00  17.82 38.464 
2016-05-17 21:19:00  17.82 38.464 
2016-05-17 21:20:00  17.82 38.464 
2016-05-17 21:21:00  17.82 38.464 
2016-05-17 21:22:00  17.82 38.464 
2016-05-17 21:23:00  17.82 38.464 
2016-05-17 21:24:00  17.82 38.464 
2016-05-17 21:25:00  17.82 38.464 
2016-05-17 21:26:00  17.82 38.464 
2016-05-17 21:27:00  17.82 38.464 

好像我應該得到mean值與實際值之差的絕對值不工作的一部分

+0

你能張貼有點大樣本DF和期望的DF?你想過濾原始DF還是重新採樣後? – MaxU

+0

'消除5°C或5%偏離計算均值的那些值 - 是否意味着整個DF的全局「平均值」? – MaxU

+0

如果記錄超出可接受的差異,那麼您可能需要確定可接受的差異,然後將其寫入不良數據 – kyle

回答

1

我不知道這是最漂亮的/最優雅的解決方案,但它應該做的工作:

代碼:

df.ix[(df[['Temp','Hum']] 
     - 
     df.groupby(pd.TimeGrouper('1H', key='Timestamp')).transform('mean') 
    ).abs() 
     .query('Temp < 5 and Hum < 5') 
     .index 
    ] 

解決方案:

In [115]: df.ix[(df[['Temp','Hum']] 
    .....:  - 
    .....:  df.groupby(pd.TimeGrouper('1H', key='Timestamp')).transform('mean') 
    .....:  ).abs() 
    .....:  .query('Temp < 5 and Hum < 5') 
    .....:  .index 
    .....:  ] 
Out[115]: 
      Timestamp Temp Hum 
0 2016-05-17 20:17:00 18.5 39.2 
1 2016-05-17 20:18:00 18.5 39.2 
2 2016-05-17 20:19:00 18.6 39.3 
3 2016-05-17 20:20:00 18.5 39.3 
4 2016-05-17 21:21:00 18.5 39.3 
5 2016-05-17 21:22:00 18.4 39.2 
6 2016-05-17 21:23:00 18.5 39.3 
7 2016-05-17 21:24:00 18.4 39.3 
8 2016-05-17 21:25:00 18.5 39.4 
9 2016-05-17 21:26:00 18.4 39.3 
10 2016-05-17 21:27:00 18.3 39.4 
11 2016-05-17 21:28:00 18.3 39.4 
12 2016-05-17 21:29:00 18.4 39.5 
14 2016-05-17 21:31:00 18.4 39.5 
15 2016-05-17 21:32:00 18.3 39.5 
16 2016-05-17 21:33:00 18.3 39.5 
17 2016-05-17 21:34:00 18.3 39.5 
18 2016-05-17 21:35:00 18.3 39.5 
19 2016-05-17 21:36:00 18.3 39.6 
20 2016-05-17 21:37:00 18.3 39.6 
21 2016-05-17 21:38:00 18.3 39.6 
22 2016-05-17 21:39:00 18.3 39.6 
24 2016-05-17 21:41:00 18.2 39.5 

說明:下面的表達式會給我們實際值和平均值(對應小時)之間的絕對差值:

In [119]: (df[['Temp','Hum']] 
    .....: - 
    .....: df.groupby(pd.TimeGrouper('1H', key='Timestamp')).transform('mean') 
    .....:).abs() 
Out[119]: 
     Temp  Hum 
0 0.025000 0.050000 
1 0.025000 0.050000 
2 0.075000 0.050000 
3 0.025000 0.050000 
4 0.814286 0.985714 
5 0.714286 0.885714 
6 0.814286 0.985714 
7 0.714286 0.985714 
8 0.814286 1.085714 
9 0.714286 0.985714 
10 0.614286 1.085714 
11 0.614286 1.085714 
12 0.714286 1.185714 
13 13.285714 1.185714 
14 0.714286 1.185714 
15 0.614286 1.185714 
16 0.614286 1.185714 
17 0.614286 1.185714 
18 0.614286 1.185714 
19 0.614286 1.285714 
20 0.614286 1.285714 
21 0.614286 1.285714 
22 0.614286 1.285714 
23 0.614286 22.714286 
24 0.514286 1.185714 

數據:

In [116]: df 
Out[116]: 
      Timestamp Temp Hum 
0 2016-05-17 20:17:00 18.5 39.2 
1 2016-05-17 20:18:00 18.5 39.2 
2 2016-05-17 20:19:00 18.6 39.3 
3 2016-05-17 20:20:00 18.5 39.3 
4 2016-05-17 21:21:00 18.5 39.3 
5 2016-05-17 21:22:00 18.4 39.2 
6 2016-05-17 21:23:00 18.5 39.3 
7 2016-05-17 21:24:00 18.4 39.3 
8 2016-05-17 21:25:00 18.5 39.4 
9 2016-05-17 21:26:00 18.4 39.3 
10 2016-05-17 21:27:00 18.3 39.4 
11 2016-05-17 21:28:00 18.3 39.4 
12 2016-05-17 21:29:00 18.4 39.5 
13 2016-05-17 21:30:00 4.4 39.5 
14 2016-05-17 21:31:00 18.4 39.5 
15 2016-05-17 21:32:00 18.3 39.5 
16 2016-05-17 21:33:00 18.3 39.5 
17 2016-05-17 21:34:00 18.3 39.5 
18 2016-05-17 21:35:00 18.3 39.5 
19 2016-05-17 21:36:00 18.3 39.6 
20 2016-05-17 21:37:00 18.3 39.6 
21 2016-05-17 21:38:00 18.3 39.6 
22 2016-05-17 21:39:00 18.3 39.6 
23 2016-05-17 21:40:00 18.3 15.6 
24 2016-05-17 21:41:00 18.2 39.5 

PS我一直意圖編輯前三行,所以我們會有數據至少兩個小時,當電郵宣傳:

In [117]: df.groupby(pd.TimeGrouper('1H', key='Timestamp')).mean() 
Out[117]: 
          Temp  Hum 
Timestamp 
2016-05-17 20:00:00 18.525000 39.250000 
2016-05-17 21:00:00 17.685714 38.314286 
+0

我無法使用它,因爲我正在爲編寫代碼而苦苦掙扎,但我猜測這就是我一直在尋找的:-)我將不得不玩一下,看看它是否有效。它在python 3中嗎?括號中出現錯誤 –