지난번에 NetCDF에 대해 알아봤었다. NetCDF의 특성과 차원의 이해, 파일 구조에 대해 간략히 설명했었는데 오늘은 실제 NetCDF(이하 nc)를 파이썬으로 읽어오는 과정에 대해 알아보도록 하겠다.
https://ihatenumber.tistory.com/78
파이썬으로 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
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')
다음에는 수치모델에서의 시간을 다루는 법에 다뤄보도록 하겠다. 오늘 읽은 데이터의 시간정보는 아래 그림과 같은데 우리가 아는 시간단위로 바꾸기 위해서는 변환이 필요하다. 따라서 그 과정에 대해 다뤄보도록 하겠다.
'자료분석 및 코딩 > 파이썬' 카테고리의 다른 글
[파이썬] 해양수치모델 검증 - 1. nc 파일읽기, 특정 지점(위치) 찾기, 최근접 격자 찾기 (1) | 2024.04.30 |
---|---|
[파이썬] 해양수치모델 시간 형식 변환. GMT, UTC, KST, 그리니치, 줄리안 데이 변환 (0) | 2023.06.30 |
[파이썬] 4-1. 조위 자료 분석 (3) - datetime을 활용한 문자 숫자 날짜변환, 날짜/시간 연산, 수치모델 시간 변환 (0) | 2023.04.13 |
[파이썬] 4-1. 조위 자료 분석 (2) - dataframe의 칼럼명/열이름/헤더 수정 rename, 결측값 숫자변환 (0) | 2023.04.12 |
[파이썬] 4-1. 조위 자료 분석 - 텍스트 읽기, pandas, read_csv, 인코딩 및 옵션 (0) | 2023.04.04 |