JuliaでNetCDFファイルを読み書きする

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を参考にしました。

NetCDFファイルを読み書きする他の方法はこちら