IT pass HikiWiki - [Exp2023]NetCDF データの内容確認 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

((<"スケジュール表・各回資料 (08/09)"|[Exp2023]スケジュール表・各回資料#08-2F09>))

{{toc}}

((<データと可視化ソフトウェアの準備|[Exp2023]データと可視化ソフトウェアの準備>))でダウンロードした NetCDF データの内容を確認してみましょう.

= NetCDF データの全体を確認する

NetCDF 形式のファイルにはデータが Binary 形式で保存されているため, cat/more/less などのコマンドではその内容を確認することができません.
例えば,

  $ more air.2023.nc

としても文字化けして内容を理解することができないでしょう.

NetCDF 形式のデータの内容を確認するためのコマンドは ncdump です.
下のように使ってみましょう.

  $ ncdump air.2023.nc | less

"|" はパイプで, ここでは ncdump の出力結果を less を使って見ています.
(less を終了するには q を押しましょう.)

パイプと less は必ずしも必要ではありません.
しかし, 一般に NetCDF データは膨大なサイズになり, ncdump はファイルの内容をすべて画面 (標準出力) に表示するため, less などを使わない限り見たい部分を見ることができません.

上の ncdump を使用例では下のように表示されるでしょう.
(右側に示した # 以降の文字は説明のために追記したものですので ncdump の出力には含まれません.)
netcdf air.2023 {
dimensions:
        level = 17 ;                                # 次元の名前, サイズ
        lat = 73 ;
        lon = 144 ;
        time = UNLIMITED ; // (365 currently)
        nbnds = 2 ;
variables:                                         # 変数の型, 名前, 属性
        float level(level) ;                        # 変数の型, 名前, 次元
                level:units = "millibar" ;          # 変数の単位
                level:actual_range = 1000.f, 10.f ; # 変数の取りうる範囲
                level:long_name = "Level" ;         # 変数の長い名前
                level:positive = "down" ;           # 値が増加する向き
                level:GRIB_id = 100s ;
                level:GRIB_name = "hPa" ;
                level:axis = "Z" ;
        float lat(lat) ;                            # 変数の型, 名前, 次元
                lat:units = "degrees_north" ;       # 変数の単位
                lat:actual_range = 90.f, -90.f ;    # 変数の取りうる範囲
                lat:long_name = "Latitude" ;        # 変数の長い名前
                lat:standard_name = "latitude" ;    # 値が増加する向き

                lat:axis = "Y" ;
        float lon(lon) ;
                lon:units = "degrees_east" ;
                lon:long_name = "Longitude" ;
                lon:actual_range = 0.f, 357.5f ;
                lon:standard_name = "longitude" ;
                lon:axis = "X" ;
        double time(time) ;
                time:long_name = "Time" ;
                time:delta_t = "0000-00-01 00:00:00" ;
                time:standard_name = "time" ;
                time:axis = "T" ;
                time:units = "hours since 1800-01-01 00:00:0.0" ;
                time:avg_period = "0000-00-01 00:00:00" ;
                time:coordinate_defines = "start" ;
                time:actual_range = 1954776., 1963512. ;
        float air(time, level, lat, lon) ;
                air:long_name = "mean Daily Air temperature" ;
                air:units = "degK" ;
                air:precision = 2s ;
                air:least_significant_digit = 1s ;
                air:GRIB_id = 11s ;
                air:GRIB_name = "TMP" ;
                air:var_desc = "Air temperature" ;
                air:level_desc = "Pressure Levels" ;
                air:statistic = "Mean" ;
                air:parent_stat = "Individual Obs" ;
                air:missing_value = -9.96921e+36f ;
                air:valid_range = 150.f, 350.f ;
                air:dataset = "NCEP Reanalysis Daily Averages" ;
                air:actual_range = 162.5f, 319.9f ;
        double time_bnds(time, nbnds) ;

// global attributes:                                                      # 大域属性
                :Conventions = "COARDS" ;                                  # 規約名
                :title = "mean daily NMC reanalysis (2014)" ;              # タイトル
                :history = "created 2013/12 by Hoop (netCDF2.3)" ;         # データ生成の沿革
                :description = "Data is from NMC initialized reanalysis\n",# データの説明
                        "(4x/day).  It consists of most variables interpolated to\n",
                        "pressure surfaces from model (sigma) surfaces." ;
                :platform = "Model" ;
                :dataset_title = "NCEP-NCAR Reanalysis 1" ;
                :References = "http://www.psl.noaa.gov/data/gridded/data.ncep.reanalysis.html"   ;
data:                                                     # 変数の値

level = 1000, 925, 850, 700, 600, 500, 400, 300, 250, 200, 150, 100, 70, 50,
    30, 20, 10 ;

lat = 90, 87.5, 85, 82.5, 80, 77.5, 75, 72.5, 70, 67.5, 65, 62.5, 60, 57.5,
    55, 52.5, 50, 47.5, 45, 42.5, 40, 37.5, 35, 32.5, 30, 27.5, 25, 22.5, 20,
    17.5, 15, 12.5, 10, 7.5, 5, 2.5, 0, -2.5, -5, -7.5, -10, -12.5, -15,
    -17.5, -20, -22.5, -25, -27.5, -30, -32.5, -35, -37.5, -40, -42.5, -45,
    -47.5, -50, -52.5, -55, -57.5, -60, -62.5, -65, -67.5, -70, -72.5, -75,
    -77.5, -80, -82.5, -85, -87.5, -90 ;

lon = 0, 2.5, 5, 7.5, 10, 12.5, 15, 17.5, 20, 22.5, 25, 27.5, 30, 32.5, 35,
    37.5, 40, 42.5, 45, 47.5, 50, 52.5, 55, 57.5, 60, 62.5, 65, 67.5, 70,
    72.5, 75, 77.5, 80, 82.5, 85, 87.5, 90, 92.5, 95, 97.5, 100, 102.5, 105,
    107.5, 110, 112.5, 115, 117.5, 120, 122.5, 125, 127.5, 130, 132.5, 135,
    137.5, 140, 142.5, 145, 147.5, 150, 152.5, 155, 157.5, 160, 162.5, 165,
    167.5, 170, 172.5, 175, 177.5, 180, 182.5, 185, 187.5, 190, 192.5, 195,
    197.5, 200, 202.5, 205, 207.5, 210, 212.5, 215, 217.5, 220, 222.5, 225,
    227.5, 230, 232.5, 235, 237.5, 240, 242.5, 245, 247.5, 250, 252.5, 255,
    257.5, 260, 262.5, 265, 267.5, 270, 272.5, 275, 277.5, 280, 282.5, 285,
    287.5, 290, 292.5, 295, 297.5, 300, 302.5, 305, 307.5, 310, 312.5, 315,
    317.5, 320, 322.5, 325, 327.5, 330, 332.5, 335, 337.5, 340, 342.5, 345,
    347.5, 350, 352.5, 355, 357.5 ;

time = 1954776, 1954800, 1954824, 1954848, 1954872, 1954896, 1954920,
    1954944, 1954968, 1954992, 1955016, 1955040, 1955064, 1955088, 1955112,
    1955136, 1955160, 1955184, 1955208, 1955232, 1955256, 1955280, 1955304,
    1955328, 1955352, 1955376, 1955400, 1955424, 1955448, 1955472, 1955496,
    1955520, 1955544, 1955568, 1955592, 1955616, 1955640, 1955664, 1955688,
    1955712, 1955736, 1955760, 1955784, 1955808, 1955832, 1955856, 1955880,
    1955904, 1955928, 1955952, 1955976, 1956000, 1956024, 1956048, 1956072,
    1956096, 1956120, 1956144, 1956168, 1956192, 1956216, 1956240, 1956264,
    1956288, 1956312, 1956336, 1956360, 1956384, 1956408, 1956432, 1956456,
    1956480, 1956504, 1956528, 1956552, 1956576, 1956600, 1956624, 1956648,
    1956672, 1956696, 1956720, 1956744, 1956768, 1956792, 1956816, 1956840,
    1956864, 1956888, 1956912, 1956936, 1956960, 1956984, 1957008, 1957032,
  ...
}


NetCDF 形式のファイルには様々な情報が保存されていることがわかります.


* "dimensions" の項目には, 次元(軸)の名前と長さが表示されます.
  上の例では, level, lat, lon, time, nbnds という 5 種類の次元(軸)が定義されており, それぞれの長さが 17, 73, 144, 無制限 (現時点では 365), 2 であることがわかります.
  * NetCDF では, データの増減に合わせて変化することのできる「無制限」の長さを持った軸 (time) を定義することができます.

* "variables" の項目には, 変数の型, 名前, 属性が表示されます.
  NetCDF では次元(軸)の値も同名の変数として保存しておくことが望ましく, 上の例では慣例に倣って次元と同じ名前の変数として属性と値が含まれています.
  変数の属性に単位と変数の長い名前 (より詳しい名前) 等を含めることでわかりやすいデータとなっています.
  上の例では, 下の次元が含まれていることがわかります.
  * この項目の説明から, 変数 air がどのような変数/物理量であるかがわかります.
    * 実数型 : float
    * 次元 :  4 次元 (time, level, lat, lon)
    * 変数の意味 : long_name = "mean Daily Air temperature" (日平均大気温度)
    * 変数の単位 : units = "degK" ;
    * 変数の欠損値 : missing_value = -9.96921e+36f ;

* "global attributes" の項目には, ファイル全体に含まれるデータ全体の属性が表示されます. "Convention" にはデータ格納の規約の名前が書かれています.
  * NetCDF はデータ格納の形式であり, その形式でどのような(メタ)データを保存するかについては決まりがあるわけではありません. したがって, 上の例のような変数の単位や説明といったメタデータをほとんど含まない NetCDF ファイルを作成することも可能です.
    しかしそれでは使いやすい/わかりやすいデータにならないため, 研究者が議論して使いやすい/わかりやすいデータとするための決まり (規約) を定めています. その規約にも複数の種類(バージョン)があるため, "Convention" の欄にその名前を保存しています.

* "data" の項目には, ファイルが含むデータの値が表示されます.
  上に述べたように, 次元(軸)の値も保存されています.

= ncdump のオプション

ncdump には様々なオプションがあります.

== -h オプション

格納されている次元や変数の情報のみを確認するには, 例えば,

  $ ncdump -h air.2023.nc

とすると, データの値を表示せずヘッダー部分だけを表示することができます.
NetCDF ファイルに保存されるデータは膨大になることがありますので, 保存されている変数情報のみを確認したいときには大変役に立ちます.

この例では下のように表示されるでしょう.

netcdf air.2023 {
dimensions:
        level = 17 ;
        lat = 73 ;
        lon = 144 ;
        time = UNLIMITED ; // (365 currently)
        nbnds = 2 ;
variables:
        float level(level) ;
                level:units = "millibar" ;
                level:actual_range = 1000.f, 10.f ;
                level:long_name = "Level" ;
                level:positive = "down" ;
                level:GRIB_id = 100s ;
                level:GRIB_name = "hPa" ;
                level:axis = "Z" ;
        float lat(lat) ;
                lat:units = "degrees_north" ;
                lat:actual_range = 90.f, -90.f ;
                lat:long_name = "Latitude" ;
                lat:standard_name = "latitude" ;
                lat:axis = "Y" ;
        float lon(lon) ;
                lon:units = "degrees_east" ;
                lon:long_name = "Longitude" ;
                lon:actual_range = 0.f, 357.5f ;
                lon:standard_name = "longitude" ;
                lon:axis = "X" ;
        double time(time) ;
                time:long_name = "Time" ;
                time:delta_t = "0000-00-01 00:00:00" ;
                time:standard_name = "time" ;
                time:axis = "T" ;
                time:units = "hours since 1800-01-01 00:00:0.0" ;
                time:avg_period = "0000-00-01 00:00:00" ;
                time:coordinate_defines = "start" ;
                time:actual_range = 1954776., 1963512. ;
        float air(time, level, lat, lon) ;
                air:long_name = "mean Daily Air temperature" ;
                air:units = "degK" ;
                air:precision = 2s ;
                air:least_significant_digit = 1s ;
                air:GRIB_id = 11s ;
                air:GRIB_name = "TMP" ;
                air:var_desc = "Air temperature" ;
                air:level_desc = "Pressure Levels" ;
                air:statistic = "Mean" ;
                air:parent_stat = "Individual Obs" ;
                air:missing_value = -9.96921e+36f ;
                air:valid_range = 150.f, 350.f ;
                air:dataset = "NCEP Reanalysis Daily Averages" ;
                air:actual_range = 162.5f, 319.9f ;
        double time_bnds(time, nbnds) ;

// global attributes:
                :Conventions = "COARDS" ;
                :title = "mean daily NMC reanalysis (2014)" ;
                :history = "created 2013/12 by Hoop (netCDF2.3)" ;
                :description = "Data is from NMC initialized reanalysis\n",
                        "(4x/day).  It consists of most variables interpolated to\n",
                        "pressure surfaces from model (sigma) surfaces." ;
                :platform = "Model" ;
                :dataset_title = "NCEP-NCAR Reanalysis 1" ;
                :References = "http://www.psl.noaa.gov/data/gridded/data.ncep.reanalysis.html" ;
}



== -v オプション

特定の変数の値のみを確認したいときには, 例えば,

  $ ncdump -v lat air.2023.nc

とすると, ヘッダーと変数 lat の値のみを表示することができます.
膨大なデータの中で特定の変数の値のみを確認したいときには役に立ちます.

この例では下のように表示されるでしょう.

netcdf air.2023 {
dimensions:
        level = 17 ;
        lat = 73 ;
        lon = 144 ;
        time = UNLIMITED ; // (365 currently)
        nbnds = 2 ;
variables:
        float level(level) ;
                level:units = "millibar" ;
                level:actual_range = 1000.f, 10.f ;
                level:long_name = "Level" ;
                level:positive = "down" ;
                level:GRIB_id = 100s ;
                level:GRIB_name = "hPa" ;
                level:axis = "Z" ;
        float lat(lat) ;
                lat:units = "degrees_north" ;
                lat:actual_range = 90.f, -90.f ;
                lat:long_name = "Latitude" ;
                lat:standard_name = "latitude" ;
                lat:axis = "Y" ;
        float lon(lon) ;
                lon:units = "degrees_east" ;
                lon:long_name = "Longitude" ;
                lon:actual_range = 0.f, 357.5f ;
                lon:standard_name = "longitude" ;
                lon:axis = "X" ;
        double time(time) ;
                time:long_name = "Time" ;
                time:delta_t = "0000-00-01 00:00:00" ;
                time:standard_name = "time" ;
                time:axis = "T" ;
                time:units = "hours since 1800-01-01 00:00:0.0" ;
                time:avg_period = "0000-00-01 00:00:00" ;
                time:coordinate_defines = "start" ;
                time:actual_range = 1954776., 1963512. ;
        float air(time, level, lat, lon) ;
                air:long_name = "mean Daily Air temperature" ;
                air:units = "degK" ;
                air:precision = 2s ;
                air:least_significant_digit = 1s ;
                air:GRIB_id = 11s ;
                air:GRIB_name = "TMP" ;
                air:var_desc = "Air temperature" ;
                air:level_desc = "Pressure Levels" ;
                air:statistic = "Mean" ;
                air:parent_stat = "Individual Obs" ;
                air:missing_value = -9.96921e+36f ;
                air:valid_range = 150.f, 350.f ;
                air:dataset = "NCEP Reanalysis Daily Averages" ;
                air:actual_range = 162.5f, 319.9f ;
        double time_bnds(time, nbnds) ;

// global attributes:
                :Conventions = "COARDS" ;
                :title = "mean daily NMC reanalysis (2014)" ;
                :history = "created 2013/12 by Hoop (netCDF2.3)" ;
                :description = "Data is from NMC initialized reanalysis\n",
                        "(4x/day).  It consists of most variables interpolated to\n",
                        "pressure surfaces from model (sigma) surfaces." ;
                :platform = "Model" ;
                :dataset_title = "NCEP-NCAR Reanalysis 1" ;
                :References = "http://www.psl.noaa.gov/data/gridded/data.ncep.reanalysis.html" ;
data:

lat = 90, 87.5, 85, 82.5, 80, 77.5, 75, 72.5, 70, 67.5, 65, 62.5, 60, 57.5,
    55, 52.5, 50, 47.5, 45, 42.5, 40, 37.5, 35, 32.5, 30, 27.5, 25, 22.5, 20,
    17.5, 15, 12.5, 10, 7.5, 5, 2.5, 0, -2.5, -5, -7.5, -10, -12.5, -15,
    -17.5, -20, -22.5, -25, -27.5, -30, -32.5, -35, -37.5, -40, -42.5, -45,
    -47.5, -50, -52.5, -55, -57.5, -60, -62.5, -65, -67.5, -70, -72.5, -75,
    -77.5, -80, -82.5, -85, -87.5, -90 ;
}


= マニュアル

== man

ncdump の詳しい解説は, man コマンドで確認できます.

  $ man ncdump


== 引数なし実行 (オプションとは言いませんが)

ncdump を引数なしで (ファイル名も指定せずに) 実行すると help が表示されます.

  $ ncdump

のようにすると, 下のように表示されます.

ncdump [-c|-h] [-v ...] [[-b|-f] [c|f]] [-l len] [-n name] [-p n[,n]] [-k] [-x] [-s] [-t|-i] [-g ...] [-w] [-Ln] file
  [-c]             Coordinate variable data and header information
  [-h]             Header information only, no data
  [-v var1[,...]]  Data for variable(s) <var1>,... only
  [-b [c|f]]       Brief annotations for C or Fortran indices in data
  [-f [c|f]]       Full annotations for C or Fortran indices in data
  [-l len]         Line length maximum in data section (default 80)
  [-n name]        Name for netCDF (default derived from file name)
  [-p n[,n]]       Display floating-point values with less precision
  [-k]             Output kind of netCDF file
  [-s]             Output special (virtual) attributes
  [-t]             Output time data as date-time strings
  [-i]             Output time data as date-time strings with ISO-8601 'T' separator
  [-g grp1[,...]]  Data and metadata for group(s) <grp1>,... only
  [-w]             With client-side caching of variables for DAP URLs
  [-x]             Output XML (NcML) instead of CDL
  [-Xp]            Unconditionally suppress output of the properties attribute
  [-Ln]            Set log level to n (>= 0); ignore if logging not enabled.
  file             Name of netCDF file (or URL if DAP access enabled)
netcdf library version 4.4.1.1 of Apr  4 2017 06:09:19 $

ncdump の様々なオプションを確認することができます.

また, ((<ここ|URL:http://www.gfd-dennou.org/arch/ucar/netcdf-jman/guidef/netCDF_ja91.html>))には, 地球流体電脳倶楽部の有志が日本語訳したマニュアルがありますので, 必要に応じて参考にするとよいでしょう.