2016-05-27 39 views
0

我有10年(1995-2004)的時間序列日常數據集,其中一些缺失值爲9999.00。我想計算每年的年平均值,而不考慮缺失值。使用shell腳本計算閏年日曆中的年平均值

我可以能夠與下面的命令

awk '!/\9999.00/{sum += $1; count++} NR%365==0{print count ? (sum) :9999.00;sum=count=0}'ifile 

使其考慮365天日曆但我不能能夠與閏年日曆修改。我還需要添加多年的專欄。我的願望輸出是

1995 annual_average 
1996 annual_average 
1997 annual_average 
.... 

例如: 我從1995 - 2000年以下數據。我需要計算每3條線,而不是365和4線,而不是366的平均,如果它是一個閏年:

3 
3 
4 
9999.00 
4 
9999.00 
13 
3 
9999.00 
9999.00 
9999.00 
9999.00 
9999.00 
3 
4 
2 
2 
2.6 
5.1 
4.5 

試用命令:

awk '!/\9999.00/{sum += $1; count++} NR%3==0{print count ? (sum) :9999.00;sum=count=0}'ifile 

慾望輸出:

1995 3.33 
1996 8.5 it is a leap year, so average of 4 lines without considering missing values (4+13)/2 
1997 3 
1998 9999.00 
1999 3 
2000 3.55 leap year 
+0

366天的日曆是什麼意思?你是說閏年?您還應該提供樣本數據輸入。 – xvan

+1

您可以通過[此規則](http://stackoverflow.com/a/22352190/1477064)確定一年是否爲閏年,並使用該信息將NR%365更改爲NR%366。我的awk foo是不夠的嘗試。 – xvan

+0

謝謝您提供更多信息@xvan但我無法修改我的腳本。主要問題是在一個時間序列中,NR%365將如何變爲NR%366? – Kay

回答

1

此代碼適用於您的示例數據。當然,你將需要調整target值:

BEGIN { 
    year = 0; 
    target = 3; 
} 
$1 < 9990.00 { 
    sum += $1; 
    count++; 
} 
NR == target { 
    if (count == 0) { 
     print "9999"; 
    } else { 
     print sum/count; 
    } 
    sum = 0; 
    count = 0; 
    year++; 
    if (year % 4 == 1) { 
     target += 4; 
    } else { 
     target += 3; 
    } 
} 

哦,記住了非常簡單的閏年的計算會有些年頭了失敗,雖然沒有你提到的年。