Calcula valores médios para cada dia ao longo de vários anos

0

Eu tenho alguns dados "CSV" (usando ; como delimitador) tendo uma linha para todos os dias de 1971-01-01 a 2099-12-31 (um período de 2099 a 1971 = 128 anos). Os dados estão organizados da seguinte forma:

YEAR;MONTH;DAY;RES1;RES2
1971;1;1;1206.1;627
1971;1;2;1303.4;654.3
1971;1;3;1248.9;662
1971;1;4;1188.8;666.8
1971;1;5;1055.2;667.8
1971;1;6;987.1;663.3
1971;1;7;939.2;655.1
1971;1;8;883.2;644.4
          ︙
2099;12;29;791.7;664.3
2099;12;30;746.7;646.4
2099;12;31;706.8;629.3

Com esses dados, preciso calcular o valor médio de cada dia de calendário (dos 365 em um ano) ao longo de todos os anos (por isso, reter mês e dia e média ao longo dos anos). Por exemplo, desde os dados de 1971 até 2100, tenho 128 pontos de dados para 01-01 (1º de janeiro). Eu gostaria de calcular a média desses 128 valores para 1 de janeiro (ou seja, os valores para 1971-01-01, 1972-01-01, ..., 2099-01-01); e assim por diante para o dia 01-02 (2 de janeiro) até o dia 12-31 (31 de dezembro). Portanto, a saída desejada deve incluir 365 dias e ter a seguinte aparência:

MONTH;DAY;RES1;RES2
1;1;AVERAGE_1.1_RES1;AVERAGE_1.1_RES2
1;2;AVERAGE_1.2_RES1;AVERAGE_1.2_RES2
1;3;AVERAGE_1.3_RES1;AVERAGE_1.3_RES2
1;4;AVERAGE_1.4_RES1;AVERAGE_1.4_RES2
1;5;AVERAGE_1.5_RES1;AVERAGE_1.5_RES2
1;6;AVERAGE_1.6_RES1;AVERAGE_1.6_RES2
1;7;AVERAGE_1.7_RES1;AVERAGE_1.7_RES2
                  ︙
12;29;AVERAGE_12.29_RES1;AVERAGE_12.29_RES2
12;30;AVERAGE_12.30_RES1;AVERAGE_12.30_RES2
12;31;AVERAGE_12.31_RES1;AVERAGE_12.31_RES2

Como posso fazer isso?

    
por steve 19.08.2016 / 15:36

1 resposta

4

Se quiser calcular a média de todos os dias ao longo de todos os anos, você pode fazer algo como

awk -F\; '
  NR>1 {
    sum1[$2";"$3]+=$4; sum2[$2";"$3]+=$5; n[$2";"$3]++;
  } 
  END {
    printf "MONTH;DAY;RES1;RES2\n"; 
    for (i in n) printf "%s;%.1f;%.1f\n", i, sum1[i]/n[i], sum2[i]/n[i]
  }' file.csv

Observe que a ordem de saída não é garantida, a menos que você classifique as matrizes - a maneira mais conveniente de fazer isso depende um pouco do sabor de awk . Ou você pode simplesmente canalizar a saída por meio de uma classificação externa.

    
por 19.08.2016 / 21:59