こんにちは。とりりんです。
今回はPythonでNetCDFファイルの作る方法を紹介したいと思います。
こんなことが知りたい方向けです。
- プログラミング初心者の方
- 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_nameやunitsで変数の名称や単位を変更することも可能です。
スポンサーリンク
また、各種出力内容はこのようになっています。
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
↓とりりんを応援して頂けると嬉しいです!↓
にほんブログ村
コメント