본문 바로가기
자료분석 및 코딩/기타 해양, 기상 정보 및 분석툴

[파이썬] 해양수치모델 NetCDF 형식의 이해

by 아다콘다 2023. 5. 22.

  해양자료를 다루다보면 꽤나 자주 접하는 데이터형식이 바로 NetCDF이다. 주로 수치모델결과 같은 대용량 수치정보를 저장할 때 쓰이며, txt나 csv같은 비교적 단순한 시계열 정보만 다루던 사람에게는 꽤나 복잡하고 이해하기 어려운 파일 형식이기도 하다. NetCDF (Network Common Data Form) 의 정의를 보면 '어레이(array) 지향 과학 데이터의 생성, 접근 및 공유를 지원하는 소프트웨어 라이브러리 및 자체 설명, 기계 독립적 데이터 형식 세트' 이다. 꽤나 어렵게 설명되어 있는데 쉽게 표현하자면 그냥 '배열 또는 행렬로 구성된 과학정보 형식' 이라고 이해하면 된다.

  일반 사용자들이 자주 사용하는 txt나 csv 형식은 단순한 시계열 정보와 같은 2차원 데이터에서는 편리할 수 있으나 수치모델 또는 공간정보와 같이 시공간 정보를 함께 담고 있는 3~4차원 데이터를 담기에는 매우 제한적이다. 예를 들어, 해양수치모델결과는 공간정보의 시간에 따른 값이 입력되어 있고, 값 또한 여러가지 변수를 포함하고 있다. 아래 그림으로 예를 들어보겠다.

 

1. 차원(dimension)의 이해

 NetCDF형식의 데이터나 수치예측모델, 면단위의 데이터를 이해하기 위해서 가장 먼저 이해해야할 개념은 차원이다. 먼저, 데이터의 차원에 대해 간단히 설명해보겠다.

1) 1차원 데이터

  한 점에서 시간에 따른 값의 변화다. 어떠한 값, 예를 들어 파고라하면, 시간(t)에 따른 파고(h)의 변화, 시계열같이 점 또는 선으로 나타낼 수 있는 데이터가 이러한 1차원 데이터이다. 이러한 데이터들은 직관적으로 확인이 용이한 txt나 csv를 활용하여도 전혀 문제가 없다.

1차원 데이터의 예시
1차원 데이터의 예시

2) 2차원 데이터

  2차원보다 하나의 차원(dimension)이 추가된다고 이해하면 된다. 공간적인 정보가 보통 3차원 데이터이다. 어떠한 영역의 위치에 따른 값의 변화가 이에 속한다. 공간(x, y)에 따른 값(h), 면 데이터라고 이해하면 된다.

2차원 데이터의 예시
2차원 데이터의 예시

 

3) 3차원 데이터

  다수의 2차원데이터인 면 데이터로 보면 된다. 위의 2차원 데이터에서 시간에 따른 변화가 추가된다고 이해하면 된다. 3차원부터는 입체적인 느낌이라 txt, csv로 표기하기가 쉽지 않다. 공간(x, y)과 시간(t)에 따른 값(h)의 변화이다.

3차원 데이터의 예시
3차원 데이터의 예시

  위에 예로 든 파고(h)값 외에도 다수의 해양정보를 포함하고 있을 때는 더욱 복잡한 형태가 된다. 공간(x, y)과 시간(t)에 따른 파고, 파향, 파주기, 파속...... 이 모든 정보를 txt로 저장, 활용하기엔 무리가 있다. 또한, 각 값마다의 부가정보들도 포함되어야 할 때가 있다. 관측정보일때는 관측소명, 표준시, 수층, 장비명 등등과 모델일때는 시간, 공간 표준, 값 단위, fill_value 등등 포함되어야 할 정보들이 많다.  따라서 이렇게 광범위한 정보를 저장하고 교환하기 위해 사용하는 데이터 형식이 바로 NetCDF이다.

 

 4차원 이상의 데이터는 굳이 설명하지 않지만 3차원 데이터에서 차원이 추가된다고 이해하면 된다. 위의 해양데이터로 예를 들어보겠다. 시간, 공간(t, x, y)에 따른 값이 3차원 데이터라면, 공간의 차원에 수층이 추가되면 4차원 데이터가 된다. 어떤 지점(x, y), 어떤 수심(D), 어떤 시간(t)에 따른 값(z)는 4차원 데이터가 된다. 따라서 차원은 (x,y,d,t), 값은 (z)의 4차원 데이터가 된다.

 

 NetCDF는 이러한 다차원, 고차원의 데이터를 저장, 활용하기에 용이한 파일 형식이라고 이해하면 된다. 수치모델정보들은 보통 한점에서 시간에 따른 값을 가진 관측정보(1차원)와는 달리, 시간에 따른 다수의 점(공간, 명)의 값을 가지기 때문에 이러한 NetCDF 형식으로 생산, 활용하게 된다.

 

2. NetCDF 형식 구조

 NetCDF의 파일 구조를 알아보도록 하겠다. 다른 분야의 데이터는 정확히 모르겠지만 과학분야, 그 중 해양, 기상분야에서 활용하는 NetCDF파일들은 Dimension(차원), Variables(변수), attributes(속성정보)로 나누어져 있다. NetCDF의 파일을 확인하기 위해서는 리눅스에서는 ncdump, 매트랩에서는 ncinfo를 활용하면 된다. ncdump가 설치되어있다면 "ncdump -h 파일이름" 과 같이 입력하면 아래와 같이 정보를 확인할 수 있다(-h 옵션은 header 만 확인하는 옵션으로 입력하지 않는다면 실제 데이터 모두가 출력됨).

리눅스 프롬프트창에서 NetCDF 정보 확인 - ncdump
리눅스 프롬프트창에서 NetCDF 정보 확인 - ncdump

 위 예로든 데이터는 CMEMS의 파랑모델정보인데, 차원과 (3차원 - 시간, 위도, 경도) 변수(VPED, VTPK, ...), 속성(기타 정보와 관련된 속성정보)을 확인할 수 있다.

 

 

 matlab에서는 ncinfo로 확인을 할 수 있다. 본 블로그에서는 매트랩을 다루지는 않지만 GUI기능의 워낙 강력한 툴이기에 nc정보 구조를 이해하기에도 편해서 잠시 활용해보았다.

 매트랩에서는 ncinfo('파일이름')과 같이 입력하면 파일의 구조를 확인가능하다. A = ncinfo('파일이름')과 같이 입력하면 nc파일의 정보를 A라는 변수로 저장하기 때문에 변수처럼 확인이 가능하다.

Matlab에서의 NetCDF 정보 확인 - ncinfo
Matlab에서의 NetCDF 정보 확인 - ncinfo

 

 파이썬에서는 netCDF4 라이브러리를 활용한다. import netCDF4 as nc로 라이브러리를 읽어온 다음, ncfile = nc.Dataset ('파일이름')과 같이 Dataset 함수를 이용해 파일을 읽는다. 다음 ncfile을 프린트해보면 아래와 같이 nc파일 정보를 확인할 수 있다.

파이썬에서의 NetCDF 정보 확인
파이썬에서의 NetCDF 정보 확인

 

 요약해보자면, NetCDF의 파일 구조는 아래와 같이 나타낼 수 있다. 파일안에는 크게 차원, 변수, 메타정보로 나뉘어 구성되어 있고(파일에 따라서는 Groups로 나뉘는 경우도 있음), Dimensions에는 각 차원에 대한 정보들(주로 위도, 경도, 시간의 크기, 갯수 등), Variables에는 실제 변수들의 값이 들어있고, Attributes에는 파일에 대한 메타정보들이 들어있다. 또한, Variables 안에도 Attributes가 있는데 이는 각 변수에 대한 메타정보, 속성정보가 들어있다. 따라서, 값에 대한 속성정보가 필요할 때는 Attributes를 확인하면 되고 데이터 분석이나 활용을 할때는 Variables의 실제 값들을 읽어서 처리하면 된다. 다음글에서는 각 변수를 읽어와서 차원을 이해하고 컨투어를 그려보는 법에 대해 소개해보도록 하겠다.

NetCDF의 구조 요약
NetCDF의 구조 요약

 

반응형