JuliaでNetCDFファイルを読み書きする方法を紹介します。
NetCDFファイルとは
NetCDFとは、バイナリファイルフォーマットの一つであり、その拡張子は”.nc”である。
NetCDFは気象、海洋、気候変動などの分野で国際的に広く使われている。
Wikipedia参照
また、NetCDFファイルは、ncdumpコマンドを使うことで、どのようなデータが格納されているのか調べることができます。
使用するデータ
さっそくコードをNetCDFファイルを読み込むコードを見ていきます。
例では、このような4次元データを読み込んでいます。
netcdf PRES_0020.pe000000 {
dimensions:
z = 75 ;
x = 512 ;
y = 512 ;
time = UNLIMITED ; // (21 currently)
variables:
float PRES(time, z, y, x) ;
PRES:long_name = "pressure" ;
PRES:units = "Pa" ;
PRES:standard_name = "air_pressure" ;
PRES:_FillValue = -9.9999e+30f ;
PRES:missing_value = -9.9999e+30f ;
PRES:coordinates = "lon lat height time" ;
PRES:cell_measures = "volume: cell_volume" ;
PRES:grid = "grid" ;
PRES:location = "face" ;
上記の結果は、ncdumpコマンドを用いています。
パッケージをインストール
NetCDFファイルを読み書きするため、NCDatasetsというパッケージを用います。
Juliaでインタラクティブモードを開き、以下のように実行して、パッケージをインストールしましょう。
using Pkg
Pkg.add("NCDatasets")
Pkg.add("DataStructures")
コード(読み込み)
using NCDatasets
using DataStructures
ds = Dataset("PRES_0020.pe000000.nc")
xx = ds["x"][:]
yy = ds["y"][:]
zz = ds["z"][:]
time = ds["time"][:]
var = ds["PRES"][:,:,:,:]
解説
1行目で、NCDatasetsパッケージを呼び出します。
2行目でDataStructuresパッケージを呼び出します。
DataStructuresは、書き込む際に用います。
3行目でNetCDFファイルを読み込みます。
4行目でxxという変数にx軸の値を格納します。
5行目でyyという変数にy軸の値を格納します。
6行目でzzという変数にz軸の値を格納します。
7行目でtimeという変数に時間軸の値を格納します。
8行目でvarという変数にデータの値(PRES)を格納します。
コード(書き込み)
# 続き
ds = Dataset("out2.nc","c")
defDim(ds,"x",size(xx)[1])
defDim(ds,"y",size(yy)[1])
defDim(ds,"z",size(zz)[1])
defDim(ds,"time",size(time)[1])
defVar(ds,"x",xx,("x",))
defVar(ds,"y",yy,("y",))
defVar(ds,"z",zz,("z",))
defVar(ds,"time",time,("time",))
defVar(ds,"pres",var,("x","y","z","time"), attrib = OrderedDict(
"units" => "m/s"))
close(ds)
解説
2行目で書き込むデータを作成します。
3行~6行目で軸を定義します。
defDim(書き込むデータ,変数名,サイズ)になります。
8∼13行目で値を代入します。
defVar(書き込むデータ,変数名,値,次元)
attributeを加える場合、13行目のように追記します。
本記事を書くにあたってこちらのGithubを参考にしました。