수년간의 일일 평균 계산

수년간의 일일 평균 계산

;1971-01-01부터 2099-12-31(2099−1971=128년)까지 매일 한 행씩 포함된 일부 "CSV" 데이터(실제로 구분 기호로 사용됨)가 있습니다 . 데이터는 다음과 같이 구성됩니다.

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

이 데이터를 사용하여 모든 연도(1년에 365일)에 걸쳐 각 달력 날짜의 평균을 계산해야 합니다(따라서 월과 날짜는 물론 연도에 대한 평균도 유지해야 합니다). 예를 들어, 데이터 범위는 1971년부터 2100년까지이므로 01-01(1월 1일)에 대한 데이터 포인트는 128개입니다. 1월 1일에 이 128개 값의 평균을 계산하고 싶습니다(즉, 1971-01-01, 1972-01-01,..., 2099-01-01일 값). 02(1월 2일)부터 12~31일(12월 31일)까지 계속됩니다. 따라서 필요한 출력에는 다음과 같이 365일이 포함되어야 합니다.

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

어떻게 해야 하나요?

답변1

수년에 걸쳐 매일 평균을 내고 싶다면 다음을 수행할 수 있습니다.

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

배열을 정렬하지 않는 한 출력 순서는 보장되지 않습니다. 가장 편리한 방법은 사용자의 순서에 따라 다릅니다 awk. 또는 단순히 외부 정렬을 통해 출력을 파이프할 수도 있습니다.

관련 정보