본문 바로가기
자료분석 및 코딩/파이썬

[파이썬] 해양수치모델 NetCDF 자료처리. 파이썬 Nc 파일 읽기 ncread

by 아다콘다 2023. 6. 28.

 지난번에 NetCDF에 대해 알아봤었다. NetCDF의 특성과 차원의 이해, 파일 구조에 대해 간략히 설명했었는데 오늘은 실제 NetCDF(이하 nc)를 파이썬으로 읽어오는 과정에 대해 알아보도록 하겠다.

https://ihatenumber.tistory.com/78

 

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

해양자료를 다루다보면 꽤나 자주 접하는 데이터형식이 바로 NetCDF이다. 주로 수치모델결과 같은 대용량 수치정보를 저장할 때 쓰이며, txt나 csv같은 비교적 단순한 시계열 정보만 다루던 사람에

ihatenumber.tistory.com

 

 파이썬으로 NetCDF를 분석 & 처리할 때는 netCDF 라이브러리를 활용한다. 매트랩에서는 프로그램 내 내장 함수인 ncinfo, ncread 등을 활용하면 되는데, 이러한 기능들이 포함된 라이브러리가 NetCDF4이다. 설치는 다른 패키지와 마찬가지로 'pip install netCDF4' 와 같이 설치하면 되고, 만약 아나콘다를 사용한다면 'conda install -c anaconda netcdf4'와 같이 입력하면 된다.

 

 

 

 오늘 사용할 샘플 nc자료는 가장 대표적인 해양수치모델인 hycom을 활용하였다. 자료 다운로드는 아래 링크에서 받으면 된다. 개인적으로는 자동으로 다운받을 수 있게 짜놓은 스크립트가 있는데 이는 다음번에 올려보도록 하겠다. 어쨋든 오늘 활용할 자료는 hycom(GOFS 3.1 / GLBy0.08 / expt_93.0)의 한반도 주변 해역, 2019년 9월 11일의 예측 파일이다. 

https://ncss.hycom.org/thredds/catalog.html

 

TdsStaticCatalog https://ncss.hycom.org/thredds/catalog.html

      HYCOM + NCODA Southeast United States 1/25° Analysis (HYCOM.org)   --

ncss.hycom.org

 

1. NetCDF 파일 read

 하이컴 자료 경로는 /data/jsp 이며, 파일이름은 hycom_ocean_20190911.nc로 저장하였다. 먼저, 경로와 파일이름을 각각 변수로 저장하고, nc 패키지를 읽어온다. nc 파일을 읽어오는 라이브러리는 Dataset이다. netCDF4.Dataset(파일이름)과 같이 읽어오면 된다.

import netCDF4 as nc
path = '/data/jsp/'
fn = 'hycom_ocean_20190911.nc'
fname = path + fn
fdata = nc.Dataset(fname)

 위와 같이, nc 파일이 fdata로 저장된 것을 확인할 수 있다. nc파일을 구체적으로 확인해보고 싶다면 print로 내용을 확인해보면 된다. 그럼 아래와 같이 파일의 세부사항과 차원, 변수들을 확인할 수 있다.

 

2. 각 변수 read

 변수를 읽어오는 과정은 간단하다. 새변수 = ncdata['읽어올변수']와 같이 입력하면 된다. 위에서 ncdata는 fdata로 정의했고, 만약 위도(파일 내 'lat')를 읽어오고 싶다면, lat = fdata[lat]과 같이 입력하면 된다. 이때, 실제 값을 읽어오려면 뒤에 [:]를 같이 넣어줘야한다. 위와 같이 fdata[lat]만 입력하면 nc의 변수 'lat' 전체를 읽어오기 때문에 모듈화가 되어 있다. 따라서, 이 모듈의 값을 읽어오려면 fdata['lat'][:]과 같이 입력해야하며, 이 역시 마스크와 데이터로 나뉘어 있는 경우가 있기 때문에 값 자체만 읽어오려면 뒤에 .data를 함께 입력해준다. 그럼 마스크를 제외한 data만 읽어오게 된다.

 

 

 

 이와 같은 방법으로 시간(t), 위도(y), 경도(x), 해수면 높이(z)를 읽어보겠다. 코드 및 결과는 아래와 같다.

import netCDF4 as nc

path = '/data/jsp/'
fn = 'hycom_ocean_20190911.nc'

fname = path + fn
fdata = nc.Dataset(fname)

lat = fdata['lat'][:].data
lon = fdata['lon'][:].data
time = fdata['time'][:];
temp = fdata['water_temp'][:];

 

 변수로 저장된 결과들을 보면 위도는 총 501개, 경도는 376개, 시간은 8개로 구성되어 있는 8(t) x 509(y) x 376(x)의 자료인 것을 확인할 수 있다. 실제 데이터 수온은 40개로 구성된 하나의 차원이 더 있는데, 이는 수층이다. 하이컴은 수층별 자료를 제공한다. 따라서, 표층의 데이터만 활용하고 싶다면 첫번째 데이터만 따로 추출하면 된다(** 모델마다 상이한데, 꼭 확인 후 분석해야 한다. 하이컴은 첫번째 데이터가 표층, 모히드는 마지막 데이터가 표층).

 

 

여기까지의 코드는 아래와 같다.

import netCDF4 as nc
import matplotlib.pyplot as plt

path = '/data/jsp/'
fn = 'hycom_ocean_20190911.nc'

fname = path + fn
fdata = nc.Dataset(fname)

lat = fdata['lat'][:].data
lon = fdata['lon'][:].data
time = fdata['time'][:];
temp = fdata['water_temp'][:];
temp_surf = temp[:,0,:,:]

fig, ax = plt.subplots()
qq = ax.pcolor(lon,lat,temp_surf[0,:,:], cmap = 'jet')
cbar = fig.colorbar(qq)
cbar.set_label('surface temp')

 

 다음에는 수치모델에서의 시간을 다루는 법에 다뤄보도록 하겠다. 오늘 읽은 데이터의 시간정보는 아래 그림과 같은데 우리가 아는 시간단위로 바꾸기 위해서는 변환이 필요하다. 따라서 그 과정에 대해 다뤄보도록 하겠다.

반응형