Hitung rata-rata tahunan dari deret waktu dalam kalender tahun kabisat menggunakan skrip shell

Saya memiliki kumpulan data harian deret waktu selama 10 tahun (1995-2004) dengan beberapa nilai yang hilang seperti 9999.00. Saya ingin menghitung rata-rata tahunan setiap tahun tanpa mempertimbangkan nilai yang hilang.

Saya dapat membuatnya dengan mempertimbangkan kalender 365 hari dengan perintah berikut

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

Tapi saya tidak bisa memodifikasi kalender tahun kabisat. Saya juga perlu menambahkan kolom lain dengan tahun. Output keinginan saya adalah sebagai

1995 annual_average
1996 annual_average
1997 annual_average
....

Misalnya: Saya memiliki data berikut dari tahun 1995-2000. Saya perlu menghitung rata-rata setiap 3 baris, bukan 365 dan 4 baris, bukan 366 jika ini adalah tahun kabisat:

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

Perintah percobaan:

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

Keluaran keinginan:

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

person Kay    schedule 27.05.2016    source sumber
comment
Apakah yang Anda maksud: kalender 366 hari Maksudmu tahun kabisat? Anda juga harus memberikan contoh masukan data.   -  person xvan    schedule 27.05.2016
comment
Anda dapat menentukan apakah suatu tahun merupakan tahun kabisat dengan aturan ini dan menggunakan informasi tersebut untuk mengubah NR%365 menjadi NR%366. Awk foo saya tidak cukup untuk mencobanya.   -  person xvan    schedule 27.05.2016
comment
Terima kasih atas informasi tambahan @xvan Tapi saya tidak bisa mengubah skrip saya. Masalah utamanya adalah bagaimana NR%365 akan berubah menjadi NR%366 dalam satu rangkaian waktu?   -  person Kay    schedule 27.05.2016
comment
Ubah NR%365==0 menjadi count ==DY-1, dimana DY adalah variabel yang menyimpan jumlah hari pada tahun berjalan. Bagaimana cara menetapkan nilainya adalah apa yang harus Anda pecahkan.   -  person xvan    schedule 27.05.2016
comment
Ini pada dasarnya adalah pertanyaan yang sama dengan stackoverflow.com/questions/37474078/   -  person Michael Vehrs    schedule 27.05.2016


Jawaban (1)


Kode ini berfungsi untuk data sampel Anda. Tentu saja, Anda perlu menyesuaikan nilai 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;
    }
}

Oh, dan perlu diingat bahwa penghitungan tahun kabisat yang sangat sederhana akan gagal untuk beberapa tahun, meskipun bukan tahun yang Anda sebutkan.

person Michael Vehrs    schedule 27.05.2016