【Python】簡単にncファイルを扱えるNetCDF4を説明

Python


こんにちは。とりりんです。

今回はPythonNetCDFファイルの作る方法を紹介したいと思います。

こんなことが知りたい方向けです。

  • プログラミング初心者の方
  • Pythonを始めてみたい方
  • データ分析に興味がある方

是非最後までご覧ください。

スポンサーリンク



NetCDFファイルとは

NetCDFとは、バイナリフォーマットの1つであり、拡張子をncとするファイルのことです。

多次元データを格納できるのが特徴で、気象データなどによく使われています。

Linuxではncdumpコマンドで、ファイルの内容を確認することが可能です。

Pythonで実装

データ書き込み

まず、NetCDF4を入れておく必要があります。

pipで入れるなら、ターミナル上で以下を入力してください。

pip install netcdf4      
スポンサーリンク


Pythonでは以下の種類のNetCDFファイルを取り扱えます(何が違うかはよくわからない)。

  • NetCDF
  • NetCDF4
  • NetCDF4 Classic
  • NetCDF3 Classic
  • NetCDF3 64Bit_Offset
  • NetCDF3 64Bit_Data

今回は、全球の気温データを想定したデータを作成します。

作成したソースコードを以下に示します。

import argparse
import netCDF4 as nc4


def main():
    """
    createNetCDF.py'main
    """
    
    args = Parse()
    createNC(args)


def createNC(args):
    """
    Create Input Data and Save NetCDF File
    """

    
    if args.ncNum == 1:
        nc = nc4.Dataset(args.ncPath, "w", format="NETCDF4")
    elif args.ncNum == 2:
        nc = nc4.Dataset(args.ncPath, "w", format="NETCDF4_CLASSIC")
    elif args.ncNum == 3:
        nc = nc4.Dataset(args.ncPath, "w", format="NETCDF3_CLASSIC")
    elif args.ncNum == 4:
        nc = nc4.Dataset(args.ncPath, "w", format="NETCDF3_64BIT_OFFSET")
    elif args.ncNum == 5:
        nc = nc4.Dataset(args.ncPath, "w", format="NETCDF3_64BIT_DATA")
    else:
        nc = nc4.Dataset(args.ncPath, "w")

    latList, lonList, tempList = [], [], []

    for lon in range(0, 360, 10):
        lonList.append(lon)


    for lat in range(-60, 61, 10):
        latList.append(lat)
        tmpTempList = []
        for lon in range(0, 360, 10):
            temp = (60 - abs(lat)) * 0.6
            tmpTempList.append(temp)

        tempList.append(tmpTempList)


    nc.createDimension("lon", len(lonList))
    nc.createDimension("lat", len(latList))

    lon = nc.createVariable("lon", "i2", "lon")
    lat = nc.createVariable("lat", "i2", "lat")
    temp = nc.createVariable("t", "i2", ("lat", "lon"), fill_value=99999)

    lon[:], lat[:], temp[:, :] = lonList, latList, tempList

    nc.close()



def Parse():
    """
    CommandLine Arguments Settings

    Note:
        ncNum: Kind of NetCDF Version
               1: NetCDF4
               2: NetCDF4 Classic
               3: NetCDF3 Classic
               4: NetCDF3 64Bit_Offset
               5: NetCDF3 64Bit_Data
               Others: NetCDF
    """
    
    parser = argparse.ArgumentParser()
    parser.add_argument("-n", "--ncNum", type=int, default=0)
    parser.add_argument("-p", "--ncPath", type=str, default="./netcdf.nc")
    args = parser.parse_args()

    return args

    

if __name__ == "__main__":
    main()

スポンサーリンク

実際にNetCDFファイルを作成しているのは、createNC関数内です。

まず、netCDF4.Dataset()でファイルを開きます。

第一引数はファイルパス、第二引数でモード(”w”は書き込みモード)、fotmatでNetCDFの種類を指定可能です。

ソースを書き換えるのがめんどくさいので、コマンドライン引数でモード指定できるようにしています。

また、createDimension()でファイルに次元を追加し、createVariableで変数を作成します。

第一引数は名称、第二引数は型(i1=int8, i2=int16など)、第三引数は形状です。

(変数も名称もlonとかlatとかしているのでややこしいことになっていますが…。)

また、fill_valueで欠損値を登録できるので、欠損値があるデータにはfill_valueを追加しておきましょう。

ncファイルに情報付加

NetCDFファイルに各種情報を付与することも可能です。

ここでいう情報とは、ncファイルの履歴やデータの名称や単位です。

先ほどのソースに情報を付加する場合はこのようになります。

nc.history = "Create New"
temp.long_name = "Temperature"
temp.units = "Degree of Celsius"

nc.historyで履歴を示すことができます。

このデータがいつ作成されたかなどを記載すると良いと思います。

また、long_nameunitsで変数の名称や単位を変更することも可能です。

スポンサーリンク


また、各種出力内容はこのようになっています。

print(nc.history)
# Create New      
print(nc.dimensions)
# {'lon': : name = 'lon', size = 36, 'lat':# : name = 'lat', size = 13}
print(nc.variables.keys())
# dict_keys(['lon', 'lat', 't'])
print(nc["lat"][0], nc["t"][1][0])
# -60 6      
    

辞書型で扱うことができるので簡単ですね。

データ読み込み

書き込みができるので、もちろん読み込むことも可能です。

すごく簡単にできるんですよ。

import netCDF4

nc = netCDF4.Dataset('netcdf.nc', 'r')
temp = nc.variables['t'][:]
print(temp)

こんな感じで出力されます。

[[ 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
   0  0  0  0  0  0  0  0  0  0  0  0],
... ]]      

しっかりリストinリストで作成した内容が出力されています。

スポンサーリンク

まとめ

今回はPythonでのNetCDFファイルの扱い方について学習しました。

読み書き共に簡単で、辞書型でデータを扱えるのがすごく便利ですね。

NetCDFを使う方は、Pythonでの実装が簡単で良いと思いますよ。

最後までご覧いただき、ありがとうございました!


Python

↓とりりんを応援して頂けると嬉しいです!↓
にほんブログ村 投資ブログ お金(投資)へ

にほんブログ村

スポンサーリンク


コメント

タイトルとURLをコピーしました