WXBC 2020年度テクノロジー研修
「メッシュ気象データ分析チャレンジ!」講習テキスト

2. Pythonを用いたメッシュ気象データの処理¶

目次:¶

  • はじめに
  • 2.1 DataArrayオブジェクト構成要素の取り出し
    • 2.1.1 気象要素のハンドル名の取り出し
    • 2.1.2 データ本体の取り出し
    • 2.1.3 属性の取り出し
  • 2.2 気象データへのアクセス
    • 2.2.1 Fancy indexing
    • 2.2.2メソッド isel
    • 2.2.3メソッド sel
  • 2.3 データの演算
    • 絶対温度から摂氏への変更
    • 蒸気圧の計算
  • 2.4 時間補間
  • 2.5 時刻の取り扱い
    • 2.5.1 アメダスデータの読み込み
    • 2.5.2 DataArrayオブジェクトの時刻
  • 2.6 数値予報データの利用に向けて
  • おわりに
  • 著作権について

・はじめに¶

 第1課では、GRIB2ファイルに格納されている気象庁のGPVプロダクトを、ライブラリ Xarray が提供する DataArray オブジェクトとして取り出し、このオブジェクトのメソッドを利用して分布図と時系列ブラフを描画してみました。第2課では、DataArrayオブジェクトの取り扱い方についてさらに詳しく学びます。


2.1 DataArrayオブジェクト構成要素の取り出し¶

 まず最初に、気象データのDatasetオブジェクトやDataArrayオブジェクトから、それを構成する、気象データ本体、座標系、属性を個別に取り出す方法を習得します。第1課では気象庁MSM-GPVデータを例に学習しましたが、第2課では、全球数値予報モデルGPV(GSM-GPV)を教材に学習します。

 なにはともあれ、GSM-GPVデータをすべての予報期間について読み込み、気温、相対湿度、積算降水量のDatasetオブジェクトを作成しましょう。下のCellを実行してください。

In [1]:
# Script 1a #

#ライブラリのインポート
import wxbcgribx as wx
from pathlib import Path

#データファイルやフォルダの名前を作り出すための準備
data_root = Path("./jmadata")
yyyymmdd = "20180701"
hh = "12"

#データファイルへのパスのリストの作成
product = "gsm"
grbdir = data_root/product/yyyymmdd[0:4]/yyyymmdd[0:6]
frange = ["FD0000-0312","FD0315-0800","FD0803-1100"]
grblist= [Path(f"{grbdir}/Z__C_RJTD_{yyyymmdd}{hh}0000_GSM_GPV_Rjp_Lsurf_{oo}_grib2.bin")
          for oo in frange]

grblist
Out[1]:
[WindowsPath('jmadata/gsm/2018/201807/Z__C_RJTD_20180701120000_GSM_GPV_Rjp_Lsurf_FD0000-0312_grib2.bin'),
 WindowsPath('jmadata/gsm/2018/201807/Z__C_RJTD_20180701120000_GSM_GPV_Rjp_Lsurf_FD0315-0800_grib2.bin'),
 WindowsPath('jmadata/gsm/2018/201807/Z__C_RJTD_20180701120000_GSM_GPV_Rjp_Lsurf_FD0803-1100_grib2.bin')]
In [2]:
# Script 1b #

#データの取り出し
elements = ["TMP","RH","APCP"]
ds = wx.getgpv(grblist,elements, ncdir="./nc", to_netcdf=True, from_netcdf=True)
ds
Out[2]:
<xarray.Dataset>
Dimensions:            (latitude: 151, longitude: 121, time: 145)
Coordinates:
  * latitude           (latitude) float64 20.0 20.2 20.4 20.6 ... 49.6 49.8 50.0
  * longitude          (longitude) float64 120.0 120.2 120.5 ... 149.8 150.0
  * time               (time) datetime64[ns] 2018-07-01T12:00:00 ... 2018-07-...
Data variables:
    TMP_2maboveground  (time, latitude, longitude) float32 301.0 301.0 ... 280.8
    RH_2maboveground   (time, latitude, longitude) float32 84.31 84.39 ... 94.23
    APCP_surface       (time, latitude, longitude) float32 nan nan ... 15.78
Attributes:
    Conventions:          COARDS
    History:              created by wgrib2
    GRIB2_grid_template:  0
xarray.Dataset
    • latitude: 151
    • longitude: 121
    • time: 145
    • latitude
      (latitude)
      float64
      20.0 20.2 20.4 ... 49.6 49.8 50.0
      units :
      degrees_north
      long_name :
      latitude
      array([20. , 20.2, 20.4, 20.6, 20.8, 21. , 21.2, 21.4, 21.6, 21.8, 22. , 22.2,
             22.4, 22.6, 22.8, 23. , 23.2, 23.4, 23.6, 23.8, 24. , 24.2, 24.4, 24.6,
             24.8, 25. , 25.2, 25.4, 25.6, 25.8, 26. , 26.2, 26.4, 26.6, 26.8, 27. ,
             27.2, 27.4, 27.6, 27.8, 28. , 28.2, 28.4, 28.6, 28.8, 29. , 29.2, 29.4,
             29.6, 29.8, 30. , 30.2, 30.4, 30.6, 30.8, 31. , 31.2, 31.4, 31.6, 31.8,
             32. , 32.2, 32.4, 32.6, 32.8, 33. , 33.2, 33.4, 33.6, 33.8, 34. , 34.2,
             34.4, 34.6, 34.8, 35. , 35.2, 35.4, 35.6, 35.8, 36. , 36.2, 36.4, 36.6,
             36.8, 37. , 37.2, 37.4, 37.6, 37.8, 38. , 38.2, 38.4, 38.6, 38.8, 39. ,
             39.2, 39.4, 39.6, 39.8, 40. , 40.2, 40.4, 40.6, 40.8, 41. , 41.2, 41.4,
             41.6, 41.8, 42. , 42.2, 42.4, 42.6, 42.8, 43. , 43.2, 43.4, 43.6, 43.8,
             44. , 44.2, 44.4, 44.6, 44.8, 45. , 45.2, 45.4, 45.6, 45.8, 46. , 46.2,
             46.4, 46.6, 46.8, 47. , 47.2, 47.4, 47.6, 47.8, 48. , 48.2, 48.4, 48.6,
             48.8, 49. , 49.2, 49.4, 49.6, 49.8, 50. ])
    • longitude
      (longitude)
      float64
      120.0 120.2 120.5 ... 149.8 150.0
      units :
      degrees_east
      long_name :
      longitude
      array([120.  , 120.25, 120.5 , 120.75, 121.  , 121.25, 121.5 , 121.75, 122.  ,
             122.25, 122.5 , 122.75, 123.  , 123.25, 123.5 , 123.75, 124.  , 124.25,
             124.5 , 124.75, 125.  , 125.25, 125.5 , 125.75, 126.  , 126.25, 126.5 ,
             126.75, 127.  , 127.25, 127.5 , 127.75, 128.  , 128.25, 128.5 , 128.75,
             129.  , 129.25, 129.5 , 129.75, 130.  , 130.25, 130.5 , 130.75, 131.  ,
             131.25, 131.5 , 131.75, 132.  , 132.25, 132.5 , 132.75, 133.  , 133.25,
             133.5 , 133.75, 134.  , 134.25, 134.5 , 134.75, 135.  , 135.25, 135.5 ,
             135.75, 136.  , 136.25, 136.5 , 136.75, 137.  , 137.25, 137.5 , 137.75,
             138.  , 138.25, 138.5 , 138.75, 139.  , 139.25, 139.5 , 139.75, 140.  ,
             140.25, 140.5 , 140.75, 141.  , 141.25, 141.5 , 141.75, 142.  , 142.25,
             142.5 , 142.75, 143.  , 143.25, 143.5 , 143.75, 144.  , 144.25, 144.5 ,
             144.75, 145.  , 145.25, 145.5 , 145.75, 146.  , 146.25, 146.5 , 146.75,
             147.  , 147.25, 147.5 , 147.75, 148.  , 148.25, 148.5 , 148.75, 149.  ,
             149.25, 149.5 , 149.75, 150.  ])
    • time
      (time)
      datetime64[ns]
      2018-07-01T12:00:00 ... 2018-07-...
      long_name :
      verification time generated by wgrib2 function verftime()
      reference_time :
      1530446400.0
      reference_time_type :
      3
      reference_date :
      2018.07.01 12:00:00 UTC
      reference_time_description :
      forecasts or accumulated (including analyses), reference date is fixed
      time_step_setting :
      auto
      time_step :
      3600.0
      array(['2018-07-01T12:00:00.000000000', '2018-07-01T13:00:00.000000000',
             '2018-07-01T14:00:00.000000000', '2018-07-01T15:00:00.000000000',
             '2018-07-01T16:00:00.000000000', '2018-07-01T17:00:00.000000000',
             '2018-07-01T18:00:00.000000000', '2018-07-01T19:00:00.000000000',
             '2018-07-01T20:00:00.000000000', '2018-07-01T21:00:00.000000000',
             '2018-07-01T22:00:00.000000000', '2018-07-01T23:00:00.000000000',
             '2018-07-02T00:00:00.000000000', '2018-07-02T01:00:00.000000000',
             '2018-07-02T02:00:00.000000000', '2018-07-02T03:00:00.000000000',
             '2018-07-02T04:00:00.000000000', '2018-07-02T05:00:00.000000000',
             '2018-07-02T06:00:00.000000000', '2018-07-02T07:00:00.000000000',
             '2018-07-02T08:00:00.000000000', '2018-07-02T09:00:00.000000000',
             '2018-07-02T10:00:00.000000000', '2018-07-02T11:00:00.000000000',
             '2018-07-02T12:00:00.000000000', '2018-07-02T13:00:00.000000000',
             '2018-07-02T14:00:00.000000000', '2018-07-02T15:00:00.000000000',
             '2018-07-02T16:00:00.000000000', '2018-07-02T17:00:00.000000000',
             '2018-07-02T18:00:00.000000000', '2018-07-02T19:00:00.000000000',
             '2018-07-02T20:00:00.000000000', '2018-07-02T21:00:00.000000000',
             '2018-07-02T22:00:00.000000000', '2018-07-02T23:00:00.000000000',
             '2018-07-03T00:00:00.000000000', '2018-07-03T01:00:00.000000000',
             '2018-07-03T02:00:00.000000000', '2018-07-03T03:00:00.000000000',
             '2018-07-03T04:00:00.000000000', '2018-07-03T05:00:00.000000000',
             '2018-07-03T06:00:00.000000000', '2018-07-03T07:00:00.000000000',
             '2018-07-03T08:00:00.000000000', '2018-07-03T09:00:00.000000000',
             '2018-07-03T10:00:00.000000000', '2018-07-03T11:00:00.000000000',
             '2018-07-03T12:00:00.000000000', '2018-07-03T13:00:00.000000000',
             '2018-07-03T14:00:00.000000000', '2018-07-03T15:00:00.000000000',
             '2018-07-03T16:00:00.000000000', '2018-07-03T17:00:00.000000000',
             '2018-07-03T18:00:00.000000000', '2018-07-03T19:00:00.000000000',
             '2018-07-03T20:00:00.000000000', '2018-07-03T21:00:00.000000000',
             '2018-07-03T22:00:00.000000000', '2018-07-03T23:00:00.000000000',
             '2018-07-04T00:00:00.000000000', '2018-07-04T01:00:00.000000000',
             '2018-07-04T02:00:00.000000000', '2018-07-04T03:00:00.000000000',
             '2018-07-04T04:00:00.000000000', '2018-07-04T05:00:00.000000000',
             '2018-07-04T06:00:00.000000000', '2018-07-04T07:00:00.000000000',
             '2018-07-04T08:00:00.000000000', '2018-07-04T09:00:00.000000000',
             '2018-07-04T10:00:00.000000000', '2018-07-04T11:00:00.000000000',
             '2018-07-04T12:00:00.000000000', '2018-07-04T13:00:00.000000000',
             '2018-07-04T14:00:00.000000000', '2018-07-04T15:00:00.000000000',
             '2018-07-04T16:00:00.000000000', '2018-07-04T17:00:00.000000000',
             '2018-07-04T18:00:00.000000000', '2018-07-04T19:00:00.000000000',
             '2018-07-04T20:00:00.000000000', '2018-07-04T21:00:00.000000000',
             '2018-07-04T22:00:00.000000000', '2018-07-04T23:00:00.000000000',
             '2018-07-05T00:00:00.000000000', '2018-07-05T03:00:00.000000000',
             '2018-07-05T06:00:00.000000000', '2018-07-05T09:00:00.000000000',
             '2018-07-05T12:00:00.000000000', '2018-07-05T15:00:00.000000000',
             '2018-07-05T18:00:00.000000000', '2018-07-05T21:00:00.000000000',
             '2018-07-06T00:00:00.000000000', '2018-07-06T03:00:00.000000000',
             '2018-07-06T06:00:00.000000000', '2018-07-06T09:00:00.000000000',
             '2018-07-06T12:00:00.000000000', '2018-07-06T15:00:00.000000000',
             '2018-07-06T18:00:00.000000000', '2018-07-06T21:00:00.000000000',
             '2018-07-07T00:00:00.000000000', '2018-07-07T03:00:00.000000000',
             '2018-07-07T06:00:00.000000000', '2018-07-07T09:00:00.000000000',
             '2018-07-07T12:00:00.000000000', '2018-07-07T15:00:00.000000000',
             '2018-07-07T18:00:00.000000000', '2018-07-07T21:00:00.000000000',
             '2018-07-08T00:00:00.000000000', '2018-07-08T03:00:00.000000000',
             '2018-07-08T06:00:00.000000000', '2018-07-08T09:00:00.000000000',
             '2018-07-08T12:00:00.000000000', '2018-07-08T15:00:00.000000000',
             '2018-07-08T18:00:00.000000000', '2018-07-08T21:00:00.000000000',
             '2018-07-09T00:00:00.000000000', '2018-07-09T03:00:00.000000000',
             '2018-07-09T06:00:00.000000000', '2018-07-09T09:00:00.000000000',
             '2018-07-09T12:00:00.000000000', '2018-07-09T15:00:00.000000000',
             '2018-07-09T18:00:00.000000000', '2018-07-09T21:00:00.000000000',
             '2018-07-10T00:00:00.000000000', '2018-07-10T03:00:00.000000000',
             '2018-07-10T06:00:00.000000000', '2018-07-10T09:00:00.000000000',
             '2018-07-10T12:00:00.000000000', '2018-07-10T15:00:00.000000000',
             '2018-07-10T18:00:00.000000000', '2018-07-10T21:00:00.000000000',
             '2018-07-11T00:00:00.000000000', '2018-07-11T03:00:00.000000000',
             '2018-07-11T06:00:00.000000000', '2018-07-11T09:00:00.000000000',
             '2018-07-11T12:00:00.000000000', '2018-07-11T15:00:00.000000000',
             '2018-07-11T18:00:00.000000000', '2018-07-11T21:00:00.000000000',
             '2018-07-12T00:00:00.000000000', '2018-07-12T03:00:00.000000000',
             '2018-07-12T06:00:00.000000000', '2018-07-12T09:00:00.000000000',
             '2018-07-12T12:00:00.000000000'], dtype='datetime64[ns]')
    • TMP_2maboveground
      (time, latitude, longitude)
      float32
      301.0 301.0 301.0 ... 280.8 280.8
      short_name :
      TMP_2maboveground
      long_name :
      Temperature
      level :
      2 m above ground
      units :
      K
      array([[[301.0494 , 301.0416 , 301.01035, ..., 301.50253, 301.47128,
               301.44785],
              [301.02597, 301.01035, 300.9791 , ..., 301.46347, 301.43222,
               301.40878],
              [301.07285, 301.0416 , 300.9791 , ..., 301.45566, 301.4244 ,
               301.39316],
              ...,
              [296.1041 , 296.05722, 295.93222, ..., 280.13535, 279.95566,
               279.82285],
              [295.50253, 295.40878, 295.15097, ..., 280.06503, 279.87753,
               279.74472],
              [295.13535, 294.82285, 294.36972, ..., 280.03378, 279.86972,
               279.7369 ]],
      
             [[301.1366 , 301.09753, 301.0194 , ..., 301.37878, 301.36316,
               301.35535],
              [301.12097, 301.08972, 301.02722, ..., 301.35535, 301.3319 ,
               301.3241 ],
              [301.15222, 301.12097, 301.04285, ..., 301.36316, 301.33972,
               301.3241 ],
      ...
              [298.75604, 298.24042, 297.81854, ..., 280.70917, 280.75604,
               280.74042],
              [297.90448, 297.38104, 296.8498 , ..., 280.77167, 280.82635,
               280.84198],
              [297.4748 , 296.90448, 296.27948, ..., 280.83417, 280.9123 ,
               280.96698]],
      
             [[301.19238, 301.22363, 301.28613, ..., 300.81738, 300.7627 ,
               300.73145],
              [301.2002 , 301.23145, 301.29395, ..., 300.80957, 300.67676,
               300.62207],
              [301.23926, 301.25488, 301.30957, ..., 300.72363, 300.59082,
               300.52832],
              ...,
              [295.48145, 294.9502 , 294.5752 , ..., 280.59082, 280.583  ,
               280.55957],
              [295.35645, 294.62988, 293.84863, ..., 280.65332, 280.66895,
               280.65332],
              [295.1377 , 294.35645, 293.36426, ..., 280.74707, 280.78613,
               280.7705 ]]], dtype=float32)
    • RH_2maboveground
      (time, latitude, longitude)
      float32
      84.31 84.39 84.73 ... 93.87 94.23
      short_name :
      RH_2maboveground
      long_name :
      Relative Humidity
      level :
      2 m above ground
      units :
      percent
      array([[[84.3091  , 84.38722 , 84.73097 , ..., 81.0591  , 80.84035 ,
               80.73097 ],
              [84.35597 , 84.32472 , 84.57472 , ..., 81.38722 , 81.16847 ,
               81.04347 ],
              [84.1841  , 84.3091  , 84.79347 , ..., 81.51222 , 81.26222 ,
               81.1841  ],
              ...,
              [60.527847, 68.5591  , 77.07472 , ..., 99.46535 , 99.4966  ,
               99.40285 ],
              [64.44972 , 69.4341  , 75.85597 , ..., 99.44972 , 99.41847 ,
               98.85597 ],
              [69.9341  , 74.54347 , 79.46535 , ..., 99.3091  , 98.9341  ,
               98.0591  ]],
      
             [[83.57335 , 84.07335 , 84.870224, ..., 81.401474, 81.276474,
               81.057724],
              [83.7296  , 83.82335 , 84.338974, ..., 81.620224, 81.57335 ,
               81.370224],
              [83.557724, 83.620224, 84.07335 , ..., 81.557724, 81.557724,
               81.44835 ],
      ...
              [56.600044, 59.506294, 61.92817 , ..., 91.506294, 92.95942 ,
               93.80317 ],
              [63.850044, 66.95942 , 69.725044, ..., 91.42817 , 92.27192 ,
               93.45942 ],
              [67.64692 , 70.33442 , 73.58442 , ..., 91.100044, 91.52192 ,
               92.86567 ]],
      
             [[85.13983 , 85.01483 , 84.70233 , ..., 83.96796 , 84.53046 ,
               84.96796 ],
              [85.18671 , 85.04608 , 84.74921 , ..., 83.84296 , 85.04608 ,
               85.54608 ],
              [85.18671 , 85.12421 , 84.84296 , ..., 84.70233 , 85.51483 ,
               85.78046 ],
              ...,
              [74.71796 , 77.92108 , 80.09296 , ..., 92.46796 , 93.84296 ,
               93.96796 ],
              [77.96796 , 80.65546 , 83.65546 , ..., 92.79608 , 93.87421 ,
               94.18671 ],
              [79.43671 , 81.24921 , 84.85858 , ..., 92.79608 , 93.87421 ,
               94.23358 ]]], dtype=float32)
    • APCP_surface
      (time, latitude, longitude)
      float32
      nan nan nan ... 16.28 16.03 15.78
      short_name :
      APCP_surface
      long_name :
      Total Precipitation
      level :
      surface
      units :
      kg/m^2
      array([[[          nan,           nan,           nan, ...,
                         nan,           nan,           nan],
              [          nan,           nan,           nan, ...,
                         nan,           nan,           nan],
              [          nan,           nan,           nan, ...,
                         nan,           nan,           nan],
              ...,
              [          nan,           nan,           nan, ...,
                         nan,           nan,           nan],
              [          nan,           nan,           nan, ...,
                         nan,           nan,           nan],
              [          nan,           nan,           nan, ...,
                         nan,           nan,           nan]],
      
             [[3.1250000e-02, 1.0156250e-01, 2.3437500e-01, ...,
               1.5625000e-02, 1.5625000e-02, 1.5625000e-02],
              [7.8125000e-03, 5.4687500e-02, 1.4062500e-01, ...,
               1.5625000e-02, 1.5625000e-02, 1.5625000e-02],
              [0.0000000e+00, 3.9062500e-02, 1.4062500e-01, ...,
               1.5625000e-02, 1.5625000e-02, 7.8125000e-03],
      ...
              [8.7029770e+01, 7.4529770e+01, 7.0779770e+01, ...,
               1.1029768e+01, 1.2779768e+01, 1.4279768e+01],
              [6.9779770e+01, 6.3779770e+01, 5.9779770e+01, ...,
               1.4779768e+01, 1.5779768e+01, 1.6529768e+01],
              [6.3279770e+01, 6.0029770e+01, 5.5779770e+01, ...,
               1.6279768e+01, 1.6029768e+01, 1.5779768e+01]],
      
             [[5.0300565e+00, 2.2800567e+00, 2.7800567e+00, ...,
               2.2530056e+01, 2.7780056e+01, 3.3030056e+01],
              [5.5300565e+00, 3.0300567e+00, 3.2800567e+00, ...,
               2.3530056e+01, 2.7530056e+01, 3.1280056e+01],
              [4.0300565e+00, 3.5300567e+00, 4.2800565e+00, ...,
               2.6280056e+01, 3.1280056e+01, 3.2530056e+01],
              ...,
              [8.7030060e+01, 7.4530060e+01, 7.0780060e+01, ...,
               1.1030057e+01, 1.2780057e+01, 1.4280057e+01],
              [6.9780060e+01, 6.3780056e+01, 5.9780056e+01, ...,
               1.4780057e+01, 1.5780057e+01, 1.6530056e+01],
              [6.3280056e+01, 6.0030056e+01, 5.6030056e+01, ...,
               1.6280056e+01, 1.6030056e+01, 1.5780057e+01]]], dtype=float32)
    • latitude
      PandasIndex
      PandasIndex(Float64Index([              20.0,               20.2,               20.4,
                    20.599999999999998, 20.799999999999997,               21.0,
                                  21.2,               21.4, 21.599999999999998,
                    21.799999999999997,
                    ...
                                  48.2,               48.4,               48.6,
                                  48.8,               49.0,               49.2,
                                  49.4,               49.6,               49.8,
                                  50.0],
                   dtype='float64', name='latitude', length=151))
    • longitude
      PandasIndex
      PandasIndex(Float64Index([ 120.0, 120.25,  120.5, 120.75,  121.0, 121.25,  121.5, 121.75,
                     122.0, 122.25,
                    ...
                    147.75,  148.0, 148.25,  148.5, 148.75,  149.0, 149.25,  149.5,
                    149.75,  150.0],
                   dtype='float64', name='longitude', length=121))
    • time
      PandasIndex
      PandasIndex(DatetimeIndex(['2018-07-01 12:00:00', '2018-07-01 13:00:00',
                     '2018-07-01 14:00:00', '2018-07-01 15:00:00',
                     '2018-07-01 16:00:00', '2018-07-01 17:00:00',
                     '2018-07-01 18:00:00', '2018-07-01 19:00:00',
                     '2018-07-01 20:00:00', '2018-07-01 21:00:00',
                     ...
                     '2018-07-11 09:00:00', '2018-07-11 12:00:00',
                     '2018-07-11 15:00:00', '2018-07-11 18:00:00',
                     '2018-07-11 21:00:00', '2018-07-12 00:00:00',
                     '2018-07-12 03:00:00', '2018-07-12 06:00:00',
                     '2018-07-12 09:00:00', '2018-07-12 12:00:00'],
                    dtype='datetime64[ns]', name='time', length=145, freq=None))
  • Conventions :
    COARDS
    History :
    created by wgrib2
    GRIB2_grid_template :
    0

2.1.1 気象要素のハンドル名の取り出し¶

 Dataset オブジェクトから特定の気象要素のデータを取り出すには、その気象要素に与えられたハンドル名を知る必要があります。上のように、一覧を表示させてしまえば確認することはできますが、オブジェクト内の複数の気象要素に対し同じ処理を繰り返すなどの場合には、ハンドル名のリストを作る必要があります。

 Datasetオブジェクト ds に含まれる気象データのハンドル名をリストで取り出すには、以下のようにします。

In [3]:
# Script 2 #

lst = list(ds.data_vars.keys())
lst
Out[3]:
['TMP_2maboveground', 'RH_2maboveground', 'APCP_surface']

同様に、座標のハンドル名をリストで取り出すには以下のようにします。

In [4]:
# Script 3 #

lst = list(ds.coords.keys())
lst
Out[4]:
['latitude', 'longitude', 'time']

 ここで、気象要素の名前を整理しておきます。GRIB2ファイルの中には、気象要素の名前が2種類存在します。一つは正式名称(以降「正式名」)で、気温であれば Temperature です。これは、属性情報としてデータの中にしまわれていて、第一課 Script 5 のように、個々に問い合わせない限り見られません。もう一つはその略称(以降「略称」)で、気温については TMP です。これはGRIB2インベントリ(グリッドデータ毎につけられた荷札のようなっもの)に使われており、データの抽出等に使われます。
そして、コマンドラインプログラム wgrib2 は、データをNetCDFファイルに書き出す際、この略称と、別途インベントリに使われている高度の名(GSM-GPVの地上気温については「2 m above ground」)を連結した文字列を自動的に生成(スペースを削除、小数点をDに変換:TMP_2maboveground)し、データを識別するハンドル名として割り付けます。このため、GRIB2ファイルから取り出されたDatasetオブジェクトやDataArrayオブジェクトにおいては、気象要素の識別にハンドル名を用います。

2.1.2 データ本体の取り出し¶

 Dataset オブジェクト ds から、特定の気象要素のデータをDataArray オブジェクト da として取り出すには以下のようにすればよいことを第1課で学びました。

da = ds["気象要素のハンドル名"]

 そして、このようにして取り出した da には座標や属性が付随していることも学びました。このDataArray オブジェクト da から、気象データだけを単純な配列(NumPy ndarray)で取り出すには、属性 data を用います。座標や時刻についても、同様に取り出すことができます。

 以下を実行して、気象データだけが配列として取り出されることを確認してください。

In [5]:
# Script 4 #

T = ds["TMP_2maboveground"] # T はDataArrayオブジェクト
T.data
Out[5]:
array([[[301.0494 , 301.0416 , 301.01035, ..., 301.50253, 301.47128,
         301.44785],
        [301.02597, 301.01035, 300.9791 , ..., 301.46347, 301.43222,
         301.40878],
        [301.07285, 301.0416 , 300.9791 , ..., 301.45566, 301.4244 ,
         301.39316],
        ...,
        [296.1041 , 296.05722, 295.93222, ..., 280.13535, 279.95566,
         279.82285],
        [295.50253, 295.40878, 295.15097, ..., 280.06503, 279.87753,
         279.74472],
        [295.13535, 294.82285, 294.36972, ..., 280.03378, 279.86972,
         279.7369 ]],

       [[301.1366 , 301.09753, 301.0194 , ..., 301.37878, 301.36316,
         301.35535],
        [301.12097, 301.08972, 301.02722, ..., 301.35535, 301.3319 ,
         301.3241 ],
        [301.15222, 301.12097, 301.04285, ..., 301.36316, 301.33972,
         301.3241 ],
        ...,
        [294.6991 , 294.66785, 294.7069 , ..., 280.29285, 280.10535,
         279.96472],
        [294.10535, 294.08972, 293.90222, ..., 280.16785, 279.98035,
         279.8319 ],
        [293.87878, 293.61316, 293.1991 , ..., 280.10535, 279.93347,
         279.79285]],

       [[301.18454, 301.17673, 301.1064 , ..., 301.2783 , 301.27048,
         301.2783 ],
        [301.1611 , 301.1611 , 301.0986 , ..., 301.25485, 301.23923,
         301.24704],
        [301.17673, 301.1689 , 301.1064 , ..., 301.2783 , 301.26266,
         301.25485],
        ...,
        [294.2158 , 294.32516, 294.27048, ..., 280.48923, 280.30173,
         280.13766],
        [293.55954, 293.64548, 293.51266, ..., 280.32516, 280.12204,
         279.9658 ],
        [293.2314 , 293.1689 , 292.9189 , ..., 280.20016, 280.02048,
         279.87985]],

       ...,

       [[301.2538 , 301.27725, 301.32413, ..., 301.44913, 301.53506,
         301.5507 ],
        [301.27725, 301.29288, 301.33975, ..., 301.33194, 301.52725,
         301.58194],
        [301.33194, 301.33194, 301.371  , ..., 301.3007 , 301.52725,
         301.6132 ],
        ...,
        [299.121  , 298.59756, 298.16006, ..., 280.6835 , 280.8788 ,
         280.94913],
        [298.29288, 297.84756, 297.33194, ..., 280.66788, 280.8632 ,
         280.97256],
        [297.746  , 297.371  , 296.91788, ..., 280.6288 , 280.83194,
         280.9882 ]],

       [[301.24042, 301.26385, 301.31854, ..., 300.89667, 300.93573,
         301.00604],
        [301.25604, 301.27167, 301.32635, ..., 300.9201 , 300.9123 ,
         300.9748 ],
        [301.27948, 301.2951 , 301.3498 , ..., 300.95917, 300.86542,
         300.90448],
        ...,
        [298.75604, 298.24042, 297.81854, ..., 280.70917, 280.75604,
         280.74042],
        [297.90448, 297.38104, 296.8498 , ..., 280.77167, 280.82635,
         280.84198],
        [297.4748 , 296.90448, 296.27948, ..., 280.83417, 280.9123 ,
         280.96698]],

       [[301.19238, 301.22363, 301.28613, ..., 300.81738, 300.7627 ,
         300.73145],
        [301.2002 , 301.23145, 301.29395, ..., 300.80957, 300.67676,
         300.62207],
        [301.23926, 301.25488, 301.30957, ..., 300.72363, 300.59082,
         300.52832],
        ...,
        [295.48145, 294.9502 , 294.5752 , ..., 280.59082, 280.583  ,
         280.55957],
        [295.35645, 294.62988, 293.84863, ..., 280.65332, 280.66895,
         280.65332],
        [295.1377 , 294.35645, 293.36426, ..., 280.74707, 280.78613,
         280.7705 ]]], dtype=float32)

 ここで、Dataset、DataArray 全般に言えることですが、

xx["○○○○○"]

の形式で記述されている部分は、データを取り出すときに限っては、以下のように書くこともできます。

xx.○○○○○

「○○○○○」が予め分かっている場合は、後者の書式のほうが書くのがラクですが、何かから読み込んで初めて分かるような場合は、前者でなければプログラミングできません。また、代入ができません。場面に応じて使い分けてください。

2.1.3 属性の取り出し¶

 DataArray オブジェクト が持つ気象データの正式名や単位等の情報は、オブジェクトの属性 arrts から辞書として取り出すことができます。

In [6]:
# Script 5 #

attr = T.attrs
attr
Out[6]:
{'short_name': 'TMP_2maboveground',
 'long_name': 'Temperature',
 'level': '2 m above ground',
 'units': 'K'}

 辞書の各要素へのアクセスはキー文字列を使用して以下のようにします。

In [7]:
# Script 6 #

attr["long_name"]
Out[7]:
'Temperature'

 属性の辞書には1文でアクセスしてもかまいません。

In [8]:
# Script 7 #

T.attrs["long_name"]
Out[8]:
'Temperature'

 なお、辞書が収録するキー文字列の一覧を得るには以下のようにします。

In [9]:
# Script 8 #

T.attrs.keys()
Out[9]:
dict_keys(['short_name', 'long_name', 'level', 'units'])

2.2 気象データへのアクセス¶

 2.1 では、DataArrayオブジェクトを構成要素に分解する方法を学びましたが、通常のデータアクセスでその必要はありません。DataArrayオブジェクトには、以下に示す様々な方法でアクセスが可能で、代入文により数値を代入する(書き換える)ことも可能です。

2.2.1 Fancy indexing¶

  最もシンプルに、各次元の要素番号を数字の並びで指定してデータを取り出すことができます。DataArrayオブジェクトは、多次元配列計算モジュール NumPy の ndarrayで配列要素を指定するのと同じ方法(Fancy indexing と呼ばれています)で要素を指定することができます。

 DataArray オブジェクト T は、[時刻、経度、緯度]の形で配列化されているので、例えば、時刻は0~9番目、緯度は0番目、経度も0番目、のデータを取り出すには、T に続けて [ 0:10, 0, 0 ] と書きます。

 下のCellを実行し、気温データが10個取り出されていること、取り出した地点の緯度経度、属性などが正しく付随していることを確認してください。

In [10]:
# Script 9 #

# 時刻0~9番目,緯度0番目,経度0番目のデータ(1次元のDataArray)
T1 = T[0:10,0,0]
T1
Out[10]:
<xarray.DataArray 'TMP_2maboveground' (time: 10)>
array([301.0494 , 301.1366 , 301.18454, 301.1515 , 301.0948 , 301.08646,
       301.1222 , 301.14294, 301.1564 , 301.18442], dtype=float32)
Coordinates:
    latitude   float64 20.0
    longitude  float64 120.0
  * time       (time) datetime64[ns] 2018-07-01T12:00:00 ... 2018-07-01T21:00:00
Attributes:
    short_name:  TMP_2maboveground
    long_name:   Temperature
    level:       2 m above ground
    units:       K
xarray.DataArray
'TMP_2maboveground'
  • time: 10
  • 301.0 301.1 301.2 301.2 301.1 301.1 301.1 301.1 301.2 301.2
    array([301.0494 , 301.1366 , 301.18454, 301.1515 , 301.0948 , 301.08646,
           301.1222 , 301.14294, 301.1564 , 301.18442], dtype=float32)
    • latitude
      ()
      float64
      20.0
      units :
      degrees_north
      long_name :
      latitude
      array(20.)
    • longitude
      ()
      float64
      120.0
      units :
      degrees_east
      long_name :
      longitude
      array(120.)
    • time
      (time)
      datetime64[ns]
      2018-07-01T12:00:00 ... 2018-07-...
      long_name :
      verification time generated by wgrib2 function verftime()
      reference_time :
      1530446400.0
      reference_time_type :
      3
      reference_date :
      2018.07.01 12:00:00 UTC
      reference_time_description :
      forecasts or accumulated (including analyses), reference date is fixed
      time_step_setting :
      auto
      time_step :
      3600.0
      array(['2018-07-01T12:00:00.000000000', '2018-07-01T13:00:00.000000000',
             '2018-07-01T14:00:00.000000000', '2018-07-01T15:00:00.000000000',
             '2018-07-01T16:00:00.000000000', '2018-07-01T17:00:00.000000000',
             '2018-07-01T18:00:00.000000000', '2018-07-01T19:00:00.000000000',
             '2018-07-01T20:00:00.000000000', '2018-07-01T21:00:00.000000000'],
            dtype='datetime64[ns]')
    • time
      PandasIndex
      PandasIndex(DatetimeIndex(['2018-07-01 12:00:00', '2018-07-01 13:00:00',
                     '2018-07-01 14:00:00', '2018-07-01 15:00:00',
                     '2018-07-01 16:00:00', '2018-07-01 17:00:00',
                     '2018-07-01 18:00:00', '2018-07-01 19:00:00',
                     '2018-07-01 20:00:00', '2018-07-01 21:00:00'],
                    dtype='datetime64[ns]', name='time', freq=None))
  • short_name :
    TMP_2maboveground
    long_name :
    Temperature
    level :
    2 m above ground
    units :
    K

 今度は、最後の時刻、全ての緯度範囲、全ての経度範囲のデータを取り出して見ましょう。Pythonのインデクシングでは、「-1」は最後、「:」は全部を意味するので、[-1, :, : ] で指定できます。

 上の指定で取り出した気温分布を、メソッド plot で図化してみます。メソッド plot が持つキーワード引数もいくつか設定してみましょう。下のCellを実行してください。

In [11]:
# Script 10 #

#最後の時刻、全ての緯度範囲、全ての経度範囲の気温分布を図化
T[-1,:,:].plot(cmap='RdYlGn_r',vmin=275, vmax=305, figsize=(7,7))
Out[11]:
<matplotlib.collections.QuadMesh at 0x234f16eb2e0>
No description has been provided for this image

2.2.2 メソッド isel¶

 Fancy indexing でデータを指定する場合、目的の要素に正しくアクセスするには、次元とその順を予め知っている必要がありますが、メソッド isel を使うと、次元の名前で要素を指定できます。次元の並び順を気にする必要もありません。これはスクリプトの可読性の向上に役立ちます。なお、記載しない次元については、その次元の要素すべてを選択したことになります。また、iselはメソッド(=関数)なので、引数は「[ ]」ではなく「( )」で括ります。

 下のCellを実行し、その結果が(Script 9)と同じであることを確認してください。

In [12]:
# Script 11 #

# スクリプト9と同じ操作
T2 = T.isel(time=slice(0,10), latitude=0, longitude=0)
T2
Out[12]:
<xarray.DataArray 'TMP_2maboveground' (time: 10)>
array([301.0494 , 301.1366 , 301.18454, 301.1515 , 301.0948 , 301.08646,
       301.1222 , 301.14294, 301.1564 , 301.18442], dtype=float32)
Coordinates:
    latitude   float64 20.0
    longitude  float64 120.0
  * time       (time) datetime64[ns] 2018-07-01T12:00:00 ... 2018-07-01T21:00:00
Attributes:
    short_name:  TMP_2maboveground
    long_name:   Temperature
    level:       2 m above ground
    units:       K
xarray.DataArray
'TMP_2maboveground'
  • time: 10
  • 301.0 301.1 301.2 301.2 301.1 301.1 301.1 301.1 301.2 301.2
    array([301.0494 , 301.1366 , 301.18454, 301.1515 , 301.0948 , 301.08646,
           301.1222 , 301.14294, 301.1564 , 301.18442], dtype=float32)
    • latitude
      ()
      float64
      20.0
      units :
      degrees_north
      long_name :
      latitude
      array(20.)
    • longitude
      ()
      float64
      120.0
      units :
      degrees_east
      long_name :
      longitude
      array(120.)
    • time
      (time)
      datetime64[ns]
      2018-07-01T12:00:00 ... 2018-07-...
      long_name :
      verification time generated by wgrib2 function verftime()
      reference_time :
      1530446400.0
      reference_time_type :
      3
      reference_date :
      2018.07.01 12:00:00 UTC
      reference_time_description :
      forecasts or accumulated (including analyses), reference date is fixed
      time_step_setting :
      auto
      time_step :
      3600.0
      array(['2018-07-01T12:00:00.000000000', '2018-07-01T13:00:00.000000000',
             '2018-07-01T14:00:00.000000000', '2018-07-01T15:00:00.000000000',
             '2018-07-01T16:00:00.000000000', '2018-07-01T17:00:00.000000000',
             '2018-07-01T18:00:00.000000000', '2018-07-01T19:00:00.000000000',
             '2018-07-01T20:00:00.000000000', '2018-07-01T21:00:00.000000000'],
            dtype='datetime64[ns]')
    • time
      PandasIndex
      PandasIndex(DatetimeIndex(['2018-07-01 12:00:00', '2018-07-01 13:00:00',
                     '2018-07-01 14:00:00', '2018-07-01 15:00:00',
                     '2018-07-01 16:00:00', '2018-07-01 17:00:00',
                     '2018-07-01 18:00:00', '2018-07-01 19:00:00',
                     '2018-07-01 20:00:00', '2018-07-01 21:00:00'],
                    dtype='datetime64[ns]', name='time', freq=None))
  • short_name :
    TMP_2maboveground
    long_name :
    Temperature
    level :
    2 m above ground
    units :
    K

2.2.3 メソッド sel¶

 メソッド sel を用いると、要素を、要素番号ではなく座標値で選び出すことができます。この際、オプション引数に「method='nearest'」を加えておくと、指定値に格子点がなくてもそこに最も近い点のデータを取り出すことができ便利です。

In [13]:
# Script 12 #

# 気象庁AMeDAS「東京」に最も近い格子点値を指定
Tt = T.sel(latitude=35.6916,longitude=139.7516, method='nearest') 
Tt.plot.line(x="time",figsize=(15,4))
Tt
Out[13]:
<xarray.DataArray 'TMP_2maboveground' (time: 145)>
array([298.2291 , 297.93347, 297.7236 , 297.51086, 297.32916, 297.1802 ,
       297.02844, 296.8617 , 296.7267 , 297.20004, 298.1899 , 299.36282,
       300.5079 , 301.45267, 302.04044, 302.23883, 302.27072, 302.1203 ,
       301.81122, 301.24606, 300.4808 , 299.7718 , 299.11298, 298.70963,
       298.42224, 298.17755, 297.95267, 297.72073, 297.49805, 297.25058,
       297.01456, 296.79587, 296.6565 , 297.10864, 298.02707, 299.05438,
       300.01288, 300.79987, 301.3209 , 301.57397, 301.63837, 301.44434,
       300.9568 , 300.37915, 299.7072 , 299.00516, 298.363  , 298.0098 ,
       297.79425, 297.62643, 297.49506, 297.3632 , 297.28555, 297.28925,
       297.40228, 297.5191 , 297.59665, 297.9111 , 298.3559 , 298.8377 ,
       299.419  , 299.90585, 300.14084, 300.13382, 300.01962, 299.87213,
       299.67944, 299.48196, 299.27225, 298.88916, 298.45312, 298.27118,
       298.19736, 298.15848, 298.10754, 298.07364, 298.00522, 297.94006,
       297.8882 , 297.86035, 297.8425 , 298.01514, 298.44064, 298.8869 ,
       299.14154, 299.53436, 299.74713, 298.48184, 297.6523 , 296.7658 ,
       296.60492, 296.75928, 297.7542 , 297.63977, 297.94272, 297.34464,
       297.32608, 297.1184 , 296.91727, 296.9486 , 296.81787, 297.1871 ,
       297.11026, 297.33865, 297.5543 , 296.7574 , 296.92694, 297.42026,
       298.74997, 300.2226 , 299.96228, 299.52036, 298.03546, 297.27548,
       296.88577, 296.95758, 298.91782, 300.9085 , 301.40442, 300.0204 ,
       298.26086, 297.35672, 296.97083, 297.03745, 299.1256 , 301.1145 ,
       301.0957 , 299.42752, 298.357  , 297.63257, 297.022  , 297.0047 ,
       298.71988, 301.03107, 302.25217, 300.22116, 298.12076, 297.38458,
       296.87378, 296.88644, 298.23135, 299.92792, 301.04288, 300.32635,
       298.03613], dtype=float32)
Coordinates:
    latitude   float64 35.6
    longitude  float64 139.8
  * time       (time) datetime64[ns] 2018-07-01T12:00:00 ... 2018-07-12T12:00:00
Attributes:
    short_name:  TMP_2maboveground
    long_name:   Temperature
    level:       2 m above ground
    units:       K
xarray.DataArray
'TMP_2maboveground'
  • time: 145
  • 298.2 297.9 297.7 297.5 297.3 297.2 ... 298.2 299.9 301.0 300.3 298.0
    array([298.2291 , 297.93347, 297.7236 , 297.51086, 297.32916, 297.1802 ,
           297.02844, 296.8617 , 296.7267 , 297.20004, 298.1899 , 299.36282,
           300.5079 , 301.45267, 302.04044, 302.23883, 302.27072, 302.1203 ,
           301.81122, 301.24606, 300.4808 , 299.7718 , 299.11298, 298.70963,
           298.42224, 298.17755, 297.95267, 297.72073, 297.49805, 297.25058,
           297.01456, 296.79587, 296.6565 , 297.10864, 298.02707, 299.05438,
           300.01288, 300.79987, 301.3209 , 301.57397, 301.63837, 301.44434,
           300.9568 , 300.37915, 299.7072 , 299.00516, 298.363  , 298.0098 ,
           297.79425, 297.62643, 297.49506, 297.3632 , 297.28555, 297.28925,
           297.40228, 297.5191 , 297.59665, 297.9111 , 298.3559 , 298.8377 ,
           299.419  , 299.90585, 300.14084, 300.13382, 300.01962, 299.87213,
           299.67944, 299.48196, 299.27225, 298.88916, 298.45312, 298.27118,
           298.19736, 298.15848, 298.10754, 298.07364, 298.00522, 297.94006,
           297.8882 , 297.86035, 297.8425 , 298.01514, 298.44064, 298.8869 ,
           299.14154, 299.53436, 299.74713, 298.48184, 297.6523 , 296.7658 ,
           296.60492, 296.75928, 297.7542 , 297.63977, 297.94272, 297.34464,
           297.32608, 297.1184 , 296.91727, 296.9486 , 296.81787, 297.1871 ,
           297.11026, 297.33865, 297.5543 , 296.7574 , 296.92694, 297.42026,
           298.74997, 300.2226 , 299.96228, 299.52036, 298.03546, 297.27548,
           296.88577, 296.95758, 298.91782, 300.9085 , 301.40442, 300.0204 ,
           298.26086, 297.35672, 296.97083, 297.03745, 299.1256 , 301.1145 ,
           301.0957 , 299.42752, 298.357  , 297.63257, 297.022  , 297.0047 ,
           298.71988, 301.03107, 302.25217, 300.22116, 298.12076, 297.38458,
           296.87378, 296.88644, 298.23135, 299.92792, 301.04288, 300.32635,
           298.03613], dtype=float32)
    • latitude
      ()
      float64
      35.6
      units :
      degrees_north
      long_name :
      latitude
      array(35.6)
    • longitude
      ()
      float64
      139.8
      units :
      degrees_east
      long_name :
      longitude
      array(139.75)
    • time
      (time)
      datetime64[ns]
      2018-07-01T12:00:00 ... 2018-07-...
      long_name :
      verification time generated by wgrib2 function verftime()
      reference_time :
      1530446400.0
      reference_time_type :
      3
      reference_date :
      2018.07.01 12:00:00 UTC
      reference_time_description :
      forecasts or accumulated (including analyses), reference date is fixed
      time_step_setting :
      auto
      time_step :
      3600.0
      array(['2018-07-01T12:00:00.000000000', '2018-07-01T13:00:00.000000000',
             '2018-07-01T14:00:00.000000000', '2018-07-01T15:00:00.000000000',
             '2018-07-01T16:00:00.000000000', '2018-07-01T17:00:00.000000000',
             '2018-07-01T18:00:00.000000000', '2018-07-01T19:00:00.000000000',
             '2018-07-01T20:00:00.000000000', '2018-07-01T21:00:00.000000000',
             '2018-07-01T22:00:00.000000000', '2018-07-01T23:00:00.000000000',
             '2018-07-02T00:00:00.000000000', '2018-07-02T01:00:00.000000000',
             '2018-07-02T02:00:00.000000000', '2018-07-02T03:00:00.000000000',
             '2018-07-02T04:00:00.000000000', '2018-07-02T05:00:00.000000000',
             '2018-07-02T06:00:00.000000000', '2018-07-02T07:00:00.000000000',
             '2018-07-02T08:00:00.000000000', '2018-07-02T09:00:00.000000000',
             '2018-07-02T10:00:00.000000000', '2018-07-02T11:00:00.000000000',
             '2018-07-02T12:00:00.000000000', '2018-07-02T13:00:00.000000000',
             '2018-07-02T14:00:00.000000000', '2018-07-02T15:00:00.000000000',
             '2018-07-02T16:00:00.000000000', '2018-07-02T17:00:00.000000000',
             '2018-07-02T18:00:00.000000000', '2018-07-02T19:00:00.000000000',
             '2018-07-02T20:00:00.000000000', '2018-07-02T21:00:00.000000000',
             '2018-07-02T22:00:00.000000000', '2018-07-02T23:00:00.000000000',
             '2018-07-03T00:00:00.000000000', '2018-07-03T01:00:00.000000000',
             '2018-07-03T02:00:00.000000000', '2018-07-03T03:00:00.000000000',
             '2018-07-03T04:00:00.000000000', '2018-07-03T05:00:00.000000000',
             '2018-07-03T06:00:00.000000000', '2018-07-03T07:00:00.000000000',
             '2018-07-03T08:00:00.000000000', '2018-07-03T09:00:00.000000000',
             '2018-07-03T10:00:00.000000000', '2018-07-03T11:00:00.000000000',
             '2018-07-03T12:00:00.000000000', '2018-07-03T13:00:00.000000000',
             '2018-07-03T14:00:00.000000000', '2018-07-03T15:00:00.000000000',
             '2018-07-03T16:00:00.000000000', '2018-07-03T17:00:00.000000000',
             '2018-07-03T18:00:00.000000000', '2018-07-03T19:00:00.000000000',
             '2018-07-03T20:00:00.000000000', '2018-07-03T21:00:00.000000000',
             '2018-07-03T22:00:00.000000000', '2018-07-03T23:00:00.000000000',
             '2018-07-04T00:00:00.000000000', '2018-07-04T01:00:00.000000000',
             '2018-07-04T02:00:00.000000000', '2018-07-04T03:00:00.000000000',
             '2018-07-04T04:00:00.000000000', '2018-07-04T05:00:00.000000000',
             '2018-07-04T06:00:00.000000000', '2018-07-04T07:00:00.000000000',
             '2018-07-04T08:00:00.000000000', '2018-07-04T09:00:00.000000000',
             '2018-07-04T10:00:00.000000000', '2018-07-04T11:00:00.000000000',
             '2018-07-04T12:00:00.000000000', '2018-07-04T13:00:00.000000000',
             '2018-07-04T14:00:00.000000000', '2018-07-04T15:00:00.000000000',
             '2018-07-04T16:00:00.000000000', '2018-07-04T17:00:00.000000000',
             '2018-07-04T18:00:00.000000000', '2018-07-04T19:00:00.000000000',
             '2018-07-04T20:00:00.000000000', '2018-07-04T21:00:00.000000000',
             '2018-07-04T22:00:00.000000000', '2018-07-04T23:00:00.000000000',
             '2018-07-05T00:00:00.000000000', '2018-07-05T03:00:00.000000000',
             '2018-07-05T06:00:00.000000000', '2018-07-05T09:00:00.000000000',
             '2018-07-05T12:00:00.000000000', '2018-07-05T15:00:00.000000000',
             '2018-07-05T18:00:00.000000000', '2018-07-05T21:00:00.000000000',
             '2018-07-06T00:00:00.000000000', '2018-07-06T03:00:00.000000000',
             '2018-07-06T06:00:00.000000000', '2018-07-06T09:00:00.000000000',
             '2018-07-06T12:00:00.000000000', '2018-07-06T15:00:00.000000000',
             '2018-07-06T18:00:00.000000000', '2018-07-06T21:00:00.000000000',
             '2018-07-07T00:00:00.000000000', '2018-07-07T03:00:00.000000000',
             '2018-07-07T06:00:00.000000000', '2018-07-07T09:00:00.000000000',
             '2018-07-07T12:00:00.000000000', '2018-07-07T15:00:00.000000000',
             '2018-07-07T18:00:00.000000000', '2018-07-07T21:00:00.000000000',
             '2018-07-08T00:00:00.000000000', '2018-07-08T03:00:00.000000000',
             '2018-07-08T06:00:00.000000000', '2018-07-08T09:00:00.000000000',
             '2018-07-08T12:00:00.000000000', '2018-07-08T15:00:00.000000000',
             '2018-07-08T18:00:00.000000000', '2018-07-08T21:00:00.000000000',
             '2018-07-09T00:00:00.000000000', '2018-07-09T03:00:00.000000000',
             '2018-07-09T06:00:00.000000000', '2018-07-09T09:00:00.000000000',
             '2018-07-09T12:00:00.000000000', '2018-07-09T15:00:00.000000000',
             '2018-07-09T18:00:00.000000000', '2018-07-09T21:00:00.000000000',
             '2018-07-10T00:00:00.000000000', '2018-07-10T03:00:00.000000000',
             '2018-07-10T06:00:00.000000000', '2018-07-10T09:00:00.000000000',
             '2018-07-10T12:00:00.000000000', '2018-07-10T15:00:00.000000000',
             '2018-07-10T18:00:00.000000000', '2018-07-10T21:00:00.000000000',
             '2018-07-11T00:00:00.000000000', '2018-07-11T03:00:00.000000000',
             '2018-07-11T06:00:00.000000000', '2018-07-11T09:00:00.000000000',
             '2018-07-11T12:00:00.000000000', '2018-07-11T15:00:00.000000000',
             '2018-07-11T18:00:00.000000000', '2018-07-11T21:00:00.000000000',
             '2018-07-12T00:00:00.000000000', '2018-07-12T03:00:00.000000000',
             '2018-07-12T06:00:00.000000000', '2018-07-12T09:00:00.000000000',
             '2018-07-12T12:00:00.000000000'], dtype='datetime64[ns]')
    • time
      PandasIndex
      PandasIndex(DatetimeIndex(['2018-07-01 12:00:00', '2018-07-01 13:00:00',
                     '2018-07-01 14:00:00', '2018-07-01 15:00:00',
                     '2018-07-01 16:00:00', '2018-07-01 17:00:00',
                     '2018-07-01 18:00:00', '2018-07-01 19:00:00',
                     '2018-07-01 20:00:00', '2018-07-01 21:00:00',
                     ...
                     '2018-07-11 09:00:00', '2018-07-11 12:00:00',
                     '2018-07-11 15:00:00', '2018-07-11 18:00:00',
                     '2018-07-11 21:00:00', '2018-07-12 00:00:00',
                     '2018-07-12 03:00:00', '2018-07-12 06:00:00',
                     '2018-07-12 09:00:00', '2018-07-12 12:00:00'],
                    dtype='datetime64[ns]', name='time', length=145, freq=None))
  • short_name :
    TMP_2maboveground
    long_name :
    Temperature
    level :
    2 m above ground
    units :
    K
No description has been provided for this image

北緯35.69166度,東経139.75166度のアメダス「東京」に一番近い格子点として、北緯35.6度、東経139.75度が選ばれました。

 ところで、DataArrayオブジェクトのメソッド plot.line は大変便利ですが、タイトルが切れてしまったりして必ずしも万能ではありません。今後のことも考え、この図と同等の図を手書き(?)してみましょう。それは以下のような関数となります。

 以下のCellを実行してください。特に何も出力されませんが大丈夫です。

In [14]:
# Script 13 #

import matplotlib.pyplot as plt  # グラフを描画するためのモジュールのインポート
def linefig(dataarr):
    fig, ax = plt.subplots(figsize=(15,5),ncols=1,nrows=1)
    ax.set_xlabel(dataarr["time"].attrs["long_name"])
    ax.set_ylabel(dataarr.attrs["long_name"] + "  (" + dataarr.attrs["units"] + ")")
    ax.set_title("latitude = "+str(dataarr["latitude"].data)+", longitude = "+str(dataarr["longitude"].data))
    ax.plot(dataarr["time"], dataarr.T)
    plt.show()

 では、これを使ってグラフを描きなおしてみましょう。 以下を実行してください。

In [15]:
# Script 14 #

linefig(Tt)
No description has been provided for this image

2.3 データの演算¶

 DataArrayオブジェクトのデータに対する演算は、Numpy の配列計算と同じ作法で行うことができます。オブジェクト同士やオブジェクトとスカラー(単一の数値)の演算が可能です。

絶対温度から摂氏への変更¶

 DataArrayオブジェクトとスカラーの演算の一例として、絶対零度絶対温度(K)で記録されている気温データから、273.15を一律に引いて摂氏(℃)に変換し、上と同じグラフを描いてみましょう。

In [17]:
# Script 15 #

T = ds['TMP_2maboveground'] 
Tt = T.sel(latitude=35.6916,longitude=139.7516, method='nearest') 

Ttc  = Tt - 273.15  # DataArrayオブジェクトとスカラーの減算

linefig(Ttc)
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[17], line 8
      4 Tt = T.sel(latitude=35.6916,longitude=139.7516, method='nearest') 
      6 Ttc  = Tt - 273.15  # DataArrayオブジェクトとスカラーの減算
----> 8 linefig(Ttc)

Cell In[14], line 7, in linefig(dataarr)
      5 fig, ax = plt.subplots(figsize=(15,5),ncols=1,nrows=1)
      6 ax.set_xlabel(dataarr["time"].attrs["long_name"])
----> 7 ax.set_ylabel(dataarr.attrs["long_name"] + "  (" + dataarr.attrs["units"] + ")")
      8 ax.set_title("latitude = "+str(dataarr["latitude"].data)+", longitude = "+str(dataarr["longitude"].data))
      9 ax.plot(dataarr["time"], dataarr.T)

KeyError: 'long_name'
No description has been provided for this image

 エラーが出てしまいました。

 エラーメッセージから、エラーの理由を考えてみましょう。エラーは、y軸のラベルを作る所で発生し、その理由として Teの属性に「long_name」が無いことが示されています。Ttcを確認してみましょう。

In [18]:
# Script 16 #

Ttc
Out[18]:
<xarray.DataArray 'TMP_2maboveground' (time: 145)>
array([25.079102, 24.783478, 24.573608, 24.36087 , 24.179169, 24.030212,
       23.878448, 23.7117  , 23.576721, 24.050049, 25.039917, 26.21283 ,
       27.35791 , 28.302673, 28.890442, 29.088837, 29.120728, 28.970306,
       28.661224, 28.09607 , 27.33081 , 26.621796, 25.962982, 25.559631,
       25.272247, 25.027557, 24.802673, 24.57074 , 24.348053, 24.100586,
       23.864563, 23.645874, 23.5065  , 23.958649, 24.877075, 25.904388,
       26.862885, 27.649872, 28.170898, 28.42398 , 28.488373, 28.294342,
       27.806793, 27.229156, 26.55722 , 25.855164, 25.213013, 24.859802,
       24.644257, 24.47644 , 24.345062, 24.213196, 24.13556 , 24.139252,
       24.252289, 24.36911 , 24.446655, 24.761108, 25.205902, 25.687714,
       26.269012, 26.75586 , 26.990845, 26.983826, 26.869629, 26.722137,
       26.52945 , 26.33197 , 26.122253, 25.739166, 25.303131, 25.121185,
       25.047363, 25.008484, 24.95755 , 24.923645, 24.855225, 24.79007 ,
       24.73822 , 24.710358, 24.692505, 24.865143, 25.29065 , 25.736908,
       25.991547, 26.384369, 26.597137, 25.331848, 24.50232 , 23.615814,
       23.454926, 23.609283, 24.604218, 24.489777, 24.792725, 24.194641,
       24.176086, 23.968414, 23.767273, 23.798615, 23.667877, 24.03711 ,
       23.960266, 24.18866 , 24.404297, 23.607391, 23.776947, 24.270264,
       25.599976, 27.072601, 26.812286, 26.370361, 24.885468, 24.125488,
       23.735779, 23.807587, 25.767822, 27.758514, 28.254425, 26.870392,
       25.11087 , 24.206726, 23.820831, 23.887451, 25.975616, 27.964508,
       27.94571 , 26.277527, 25.207   , 24.482574, 23.87201 , 23.854706,
       25.569885, 27.881073, 29.102173, 27.071167, 24.970764, 24.234589,
       23.723785, 23.73645 , 25.08136 , 26.777924, 27.892883, 27.176361,
       24.886139], dtype=float32)
Coordinates:
    latitude   float64 35.6
    longitude  float64 139.8
  * time       (time) datetime64[ns] 2018-07-01T12:00:00 ... 2018-07-12T12:00:00
xarray.DataArray
'TMP_2maboveground'
  • time: 145
  • 25.08 24.78 24.57 24.36 24.18 24.03 ... 25.08 26.78 27.89 27.18 24.89
    array([25.079102, 24.783478, 24.573608, 24.36087 , 24.179169, 24.030212,
           23.878448, 23.7117  , 23.576721, 24.050049, 25.039917, 26.21283 ,
           27.35791 , 28.302673, 28.890442, 29.088837, 29.120728, 28.970306,
           28.661224, 28.09607 , 27.33081 , 26.621796, 25.962982, 25.559631,
           25.272247, 25.027557, 24.802673, 24.57074 , 24.348053, 24.100586,
           23.864563, 23.645874, 23.5065  , 23.958649, 24.877075, 25.904388,
           26.862885, 27.649872, 28.170898, 28.42398 , 28.488373, 28.294342,
           27.806793, 27.229156, 26.55722 , 25.855164, 25.213013, 24.859802,
           24.644257, 24.47644 , 24.345062, 24.213196, 24.13556 , 24.139252,
           24.252289, 24.36911 , 24.446655, 24.761108, 25.205902, 25.687714,
           26.269012, 26.75586 , 26.990845, 26.983826, 26.869629, 26.722137,
           26.52945 , 26.33197 , 26.122253, 25.739166, 25.303131, 25.121185,
           25.047363, 25.008484, 24.95755 , 24.923645, 24.855225, 24.79007 ,
           24.73822 , 24.710358, 24.692505, 24.865143, 25.29065 , 25.736908,
           25.991547, 26.384369, 26.597137, 25.331848, 24.50232 , 23.615814,
           23.454926, 23.609283, 24.604218, 24.489777, 24.792725, 24.194641,
           24.176086, 23.968414, 23.767273, 23.798615, 23.667877, 24.03711 ,
           23.960266, 24.18866 , 24.404297, 23.607391, 23.776947, 24.270264,
           25.599976, 27.072601, 26.812286, 26.370361, 24.885468, 24.125488,
           23.735779, 23.807587, 25.767822, 27.758514, 28.254425, 26.870392,
           25.11087 , 24.206726, 23.820831, 23.887451, 25.975616, 27.964508,
           27.94571 , 26.277527, 25.207   , 24.482574, 23.87201 , 23.854706,
           25.569885, 27.881073, 29.102173, 27.071167, 24.970764, 24.234589,
           23.723785, 23.73645 , 25.08136 , 26.777924, 27.892883, 27.176361,
           24.886139], dtype=float32)
    • latitude
      ()
      float64
      35.6
      units :
      degrees_north
      long_name :
      latitude
      array(35.6)
    • longitude
      ()
      float64
      139.8
      units :
      degrees_east
      long_name :
      longitude
      array(139.75)
    • time
      (time)
      datetime64[ns]
      2018-07-01T12:00:00 ... 2018-07-...
      long_name :
      verification time generated by wgrib2 function verftime()
      reference_time :
      1530446400.0
      reference_time_type :
      3
      reference_date :
      2018.07.01 12:00:00 UTC
      reference_time_description :
      forecasts or accumulated (including analyses), reference date is fixed
      time_step_setting :
      auto
      time_step :
      3600.0
      array(['2018-07-01T12:00:00.000000000', '2018-07-01T13:00:00.000000000',
             '2018-07-01T14:00:00.000000000', '2018-07-01T15:00:00.000000000',
             '2018-07-01T16:00:00.000000000', '2018-07-01T17:00:00.000000000',
             '2018-07-01T18:00:00.000000000', '2018-07-01T19:00:00.000000000',
             '2018-07-01T20:00:00.000000000', '2018-07-01T21:00:00.000000000',
             '2018-07-01T22:00:00.000000000', '2018-07-01T23:00:00.000000000',
             '2018-07-02T00:00:00.000000000', '2018-07-02T01:00:00.000000000',
             '2018-07-02T02:00:00.000000000', '2018-07-02T03:00:00.000000000',
             '2018-07-02T04:00:00.000000000', '2018-07-02T05:00:00.000000000',
             '2018-07-02T06:00:00.000000000', '2018-07-02T07:00:00.000000000',
             '2018-07-02T08:00:00.000000000', '2018-07-02T09:00:00.000000000',
             '2018-07-02T10:00:00.000000000', '2018-07-02T11:00:00.000000000',
             '2018-07-02T12:00:00.000000000', '2018-07-02T13:00:00.000000000',
             '2018-07-02T14:00:00.000000000', '2018-07-02T15:00:00.000000000',
             '2018-07-02T16:00:00.000000000', '2018-07-02T17:00:00.000000000',
             '2018-07-02T18:00:00.000000000', '2018-07-02T19:00:00.000000000',
             '2018-07-02T20:00:00.000000000', '2018-07-02T21:00:00.000000000',
             '2018-07-02T22:00:00.000000000', '2018-07-02T23:00:00.000000000',
             '2018-07-03T00:00:00.000000000', '2018-07-03T01:00:00.000000000',
             '2018-07-03T02:00:00.000000000', '2018-07-03T03:00:00.000000000',
             '2018-07-03T04:00:00.000000000', '2018-07-03T05:00:00.000000000',
             '2018-07-03T06:00:00.000000000', '2018-07-03T07:00:00.000000000',
             '2018-07-03T08:00:00.000000000', '2018-07-03T09:00:00.000000000',
             '2018-07-03T10:00:00.000000000', '2018-07-03T11:00:00.000000000',
             '2018-07-03T12:00:00.000000000', '2018-07-03T13:00:00.000000000',
             '2018-07-03T14:00:00.000000000', '2018-07-03T15:00:00.000000000',
             '2018-07-03T16:00:00.000000000', '2018-07-03T17:00:00.000000000',
             '2018-07-03T18:00:00.000000000', '2018-07-03T19:00:00.000000000',
             '2018-07-03T20:00:00.000000000', '2018-07-03T21:00:00.000000000',
             '2018-07-03T22:00:00.000000000', '2018-07-03T23:00:00.000000000',
             '2018-07-04T00:00:00.000000000', '2018-07-04T01:00:00.000000000',
             '2018-07-04T02:00:00.000000000', '2018-07-04T03:00:00.000000000',
             '2018-07-04T04:00:00.000000000', '2018-07-04T05:00:00.000000000',
             '2018-07-04T06:00:00.000000000', '2018-07-04T07:00:00.000000000',
             '2018-07-04T08:00:00.000000000', '2018-07-04T09:00:00.000000000',
             '2018-07-04T10:00:00.000000000', '2018-07-04T11:00:00.000000000',
             '2018-07-04T12:00:00.000000000', '2018-07-04T13:00:00.000000000',
             '2018-07-04T14:00:00.000000000', '2018-07-04T15:00:00.000000000',
             '2018-07-04T16:00:00.000000000', '2018-07-04T17:00:00.000000000',
             '2018-07-04T18:00:00.000000000', '2018-07-04T19:00:00.000000000',
             '2018-07-04T20:00:00.000000000', '2018-07-04T21:00:00.000000000',
             '2018-07-04T22:00:00.000000000', '2018-07-04T23:00:00.000000000',
             '2018-07-05T00:00:00.000000000', '2018-07-05T03:00:00.000000000',
             '2018-07-05T06:00:00.000000000', '2018-07-05T09:00:00.000000000',
             '2018-07-05T12:00:00.000000000', '2018-07-05T15:00:00.000000000',
             '2018-07-05T18:00:00.000000000', '2018-07-05T21:00:00.000000000',
             '2018-07-06T00:00:00.000000000', '2018-07-06T03:00:00.000000000',
             '2018-07-06T06:00:00.000000000', '2018-07-06T09:00:00.000000000',
             '2018-07-06T12:00:00.000000000', '2018-07-06T15:00:00.000000000',
             '2018-07-06T18:00:00.000000000', '2018-07-06T21:00:00.000000000',
             '2018-07-07T00:00:00.000000000', '2018-07-07T03:00:00.000000000',
             '2018-07-07T06:00:00.000000000', '2018-07-07T09:00:00.000000000',
             '2018-07-07T12:00:00.000000000', '2018-07-07T15:00:00.000000000',
             '2018-07-07T18:00:00.000000000', '2018-07-07T21:00:00.000000000',
             '2018-07-08T00:00:00.000000000', '2018-07-08T03:00:00.000000000',
             '2018-07-08T06:00:00.000000000', '2018-07-08T09:00:00.000000000',
             '2018-07-08T12:00:00.000000000', '2018-07-08T15:00:00.000000000',
             '2018-07-08T18:00:00.000000000', '2018-07-08T21:00:00.000000000',
             '2018-07-09T00:00:00.000000000', '2018-07-09T03:00:00.000000000',
             '2018-07-09T06:00:00.000000000', '2018-07-09T09:00:00.000000000',
             '2018-07-09T12:00:00.000000000', '2018-07-09T15:00:00.000000000',
             '2018-07-09T18:00:00.000000000', '2018-07-09T21:00:00.000000000',
             '2018-07-10T00:00:00.000000000', '2018-07-10T03:00:00.000000000',
             '2018-07-10T06:00:00.000000000', '2018-07-10T09:00:00.000000000',
             '2018-07-10T12:00:00.000000000', '2018-07-10T15:00:00.000000000',
             '2018-07-10T18:00:00.000000000', '2018-07-10T21:00:00.000000000',
             '2018-07-11T00:00:00.000000000', '2018-07-11T03:00:00.000000000',
             '2018-07-11T06:00:00.000000000', '2018-07-11T09:00:00.000000000',
             '2018-07-11T12:00:00.000000000', '2018-07-11T15:00:00.000000000',
             '2018-07-11T18:00:00.000000000', '2018-07-11T21:00:00.000000000',
             '2018-07-12T00:00:00.000000000', '2018-07-12T03:00:00.000000000',
             '2018-07-12T06:00:00.000000000', '2018-07-12T09:00:00.000000000',
             '2018-07-12T12:00:00.000000000'], dtype='datetime64[ns]')
    • time
      PandasIndex
      PandasIndex(DatetimeIndex(['2018-07-01 12:00:00', '2018-07-01 13:00:00',
                     '2018-07-01 14:00:00', '2018-07-01 15:00:00',
                     '2018-07-01 16:00:00', '2018-07-01 17:00:00',
                     '2018-07-01 18:00:00', '2018-07-01 19:00:00',
                     '2018-07-01 20:00:00', '2018-07-01 21:00:00',
                     ...
                     '2018-07-11 09:00:00', '2018-07-11 12:00:00',
                     '2018-07-11 15:00:00', '2018-07-11 18:00:00',
                     '2018-07-11 21:00:00', '2018-07-12 00:00:00',
                     '2018-07-12 03:00:00', '2018-07-12 06:00:00',
                     '2018-07-12 09:00:00', '2018-07-12 12:00:00'],
                    dtype='datetime64[ns]', name='time', length=145, freq=None))

 値自体は、正しく摂氏に変更されていますが、属性が消えてしまっています。

 DataArrayの属性情報は、値に変更が加えられると削除されます。演算して異なるものを作ったのですから属性が保存されることは逆に問題であり、これを避けるためにクリアされるのです。演算結果の属性は自ら書き込む必要があります。

 それでは、属性情報を付け直してみましょう。DataArrayオブジェクトの属性は辞書の形式で定義します。 以下のCellを実行し、気温の属性を付け直してください。

In [19]:
# Script 17 #

#T = ds['TMP_2maboveground'] 
#Tt = T.sel(latitude=35.6916,longitude=139.7516, method='nearest') 
#Ttc  = Tt - 273.15  # DataArrayオブジェクトとスカラーの減算

Ttc.attrs = {"long_name":"air temperature at Tokyo", "units":"Celsius"}  # 属性情報を設定

 今度はエラーなくグラフが描けるはずです。 下のCellを実行し確認してみましょう。

In [20]:
# Script 18 #

linefig(Ttc)
No description has been provided for this image

蒸気圧の計算¶

 次は、配列と配列の演算も含む少し複雑な演算をしてみましょう。気象庁値予報GPVは、湿度を相対湿度で提供しますが、湿度を表現する指標は相対湿度以外にもいくつかあります。その一つである水蒸気圧は、相対湿度と異なり、着目する気塊から結露や降水で水蒸気が除かれてしまわない限り一定に保たれるという特徴をもっています。相対湿度 RH [%]、気温 T [℃] の空気の水蒸気圧 e [hPa] は、近似的に下の式で表現できます。

$$ e = 6.1078 \times 10^{\left( \frac{7.5T}{T+237.3} \right)} \times \frac{RH}{100} $$

 この式をコーディングすると、下(Script 19)ようになります。このCellを実行してください。

In [21]:
# Script 19 #

#気象要素の取り出し
Tc = ds['TMP_2maboveground'] - 273.15
H = ds['RH_2maboveground']

#水蒸気圧の計算
e = 6.1078 * 10**((7.5*Tc)/(Tc+237.3)) * H/100
e.attrs = {"long_name":"water vapor pressure", "units":"hPa"} 

#分布の可視化
e[1,:,:].plot(cmap='RdYlGn_r')
Out[21]:
<matplotlib.collections.QuadMesh at 0x234f189bbe0>
No description has been provided for this image

 台湾東方に台風が存在する様子がわかります。

・注意してください¶

Pythonでは、b = a のようなスクリプトがあった場合、通常は、変数 b が新規に作られ、a の値が代入されますが、DataAttayオブジェクトの場合、新規には作られません。「 b という変数名でも a が保持するデータにアクセスできるようになる」という処理がされます。このため、別物と思ってb の内容を変更してしまうと、おおもとの a の内容まで変更されてしまいます。
例えば、先に学習した、温度の単位を kelvin から Celsius度 への変更において、以下のようにしてしまうと、Ttc と Tt の両方が Celsius度になってしまいます。

Ttc = Tt
    Ttc = Ttc - 273.15

 あるDataAttayオブジェクトの内容に手を加えた別なオブジェクトを作りたいときは、以下のようにメソッド copy を使ってオブジェクトの複製をまず作り、それに対し変更を加えます。

b = a.copy()

2.4 時間補間¶

 さて、気温の経時変化のグラフを改めて眺めてみると、後の方の線は、初めの方の線より滑らかさに欠けていることに気づきます。予報期間が比較的長い全球数値予報モデルGPV(GSM-GPV)は、84時間先までは時別のデータですが、その先(3個一組のGRIB2ファイルの2個目以降)は、3時間に1データで供給されているためです。予報の信頼性やデータサイズを考慮したうえでの仕様と思われますが、時刻の間隔が途中で変化しているとデータ分析の際にしばしば問題を引き起こします。そのようなときには、DataArrayのメソッド interp を用いて、間引かれているデータを前後の時刻のデータから補間します。

 DataArrayオブジェクト darr から、時間補間した新しいDataArrayオブジェクト darr_new を作るには以下のようにします。

darr_new = darr.interp(time=付け直す時刻の配列, method="補間方法")

 それでは、GSM-GPVの気温データ Ttc から、全予報期間にわたってデータが時別で存在する Ttch を実際に作ってみましょう。 まず、全期間にわたり1時間間隔の時刻の配列を作ります。いくつかの方法がありますが、ここでは2つ紹介します。どちらでも大丈夫です。

In [22]:
# Script 20 #

# ライブラリpandasの 関数date_rangeを使う方法

import pandas as pd
beg = pd.to_datetime(T.time[0].data)
end = pd.to_datetime(T.time[-1].data)
time1h = pd.date_range(beg, end, freq="H" )
time1h
Out[22]:
DatetimeIndex(['2018-07-01 12:00:00', '2018-07-01 13:00:00',
               '2018-07-01 14:00:00', '2018-07-01 15:00:00',
               '2018-07-01 16:00:00', '2018-07-01 17:00:00',
               '2018-07-01 18:00:00', '2018-07-01 19:00:00',
               '2018-07-01 20:00:00', '2018-07-01 21:00:00',
               ...
               '2018-07-12 03:00:00', '2018-07-12 04:00:00',
               '2018-07-12 05:00:00', '2018-07-12 06:00:00',
               '2018-07-12 07:00:00', '2018-07-12 08:00:00',
               '2018-07-12 09:00:00', '2018-07-12 10:00:00',
               '2018-07-12 11:00:00', '2018-07-12 12:00:00'],
              dtype='datetime64[ns]', length=265, freq='H')
In [23]:
# Script 21 #

# ライブラリnumpyの 関数arangeを使う方法

import numpy as np
oh = np.timedelta64(1,'h')
time1h = np.arange(T.time[0].data, T.time[-1].data+oh, oh)
time1h
Out[23]:
array(['2018-07-01T12:00:00.000000000', '2018-07-01T13:00:00.000000000',
       '2018-07-01T14:00:00.000000000', '2018-07-01T15:00:00.000000000',
       '2018-07-01T16:00:00.000000000', '2018-07-01T17:00:00.000000000',
       '2018-07-01T18:00:00.000000000', '2018-07-01T19:00:00.000000000',
       '2018-07-01T20:00:00.000000000', '2018-07-01T21:00:00.000000000',
       '2018-07-01T22:00:00.000000000', '2018-07-01T23:00:00.000000000',
       '2018-07-02T00:00:00.000000000', '2018-07-02T01:00:00.000000000',
       '2018-07-02T02:00:00.000000000', '2018-07-02T03:00:00.000000000',
       '2018-07-02T04:00:00.000000000', '2018-07-02T05:00:00.000000000',
       '2018-07-02T06:00:00.000000000', '2018-07-02T07:00:00.000000000',
       '2018-07-02T08:00:00.000000000', '2018-07-02T09:00:00.000000000',
       '2018-07-02T10:00:00.000000000', '2018-07-02T11:00:00.000000000',
       '2018-07-02T12:00:00.000000000', '2018-07-02T13:00:00.000000000',
       '2018-07-02T14:00:00.000000000', '2018-07-02T15:00:00.000000000',
       '2018-07-02T16:00:00.000000000', '2018-07-02T17:00:00.000000000',
       '2018-07-02T18:00:00.000000000', '2018-07-02T19:00:00.000000000',
       '2018-07-02T20:00:00.000000000', '2018-07-02T21:00:00.000000000',
       '2018-07-02T22:00:00.000000000', '2018-07-02T23:00:00.000000000',
       '2018-07-03T00:00:00.000000000', '2018-07-03T01:00:00.000000000',
       '2018-07-03T02:00:00.000000000', '2018-07-03T03:00:00.000000000',
       '2018-07-03T04:00:00.000000000', '2018-07-03T05:00:00.000000000',
       '2018-07-03T06:00:00.000000000', '2018-07-03T07:00:00.000000000',
       '2018-07-03T08:00:00.000000000', '2018-07-03T09:00:00.000000000',
       '2018-07-03T10:00:00.000000000', '2018-07-03T11:00:00.000000000',
       '2018-07-03T12:00:00.000000000', '2018-07-03T13:00:00.000000000',
       '2018-07-03T14:00:00.000000000', '2018-07-03T15:00:00.000000000',
       '2018-07-03T16:00:00.000000000', '2018-07-03T17:00:00.000000000',
       '2018-07-03T18:00:00.000000000', '2018-07-03T19:00:00.000000000',
       '2018-07-03T20:00:00.000000000', '2018-07-03T21:00:00.000000000',
       '2018-07-03T22:00:00.000000000', '2018-07-03T23:00:00.000000000',
       '2018-07-04T00:00:00.000000000', '2018-07-04T01:00:00.000000000',
       '2018-07-04T02:00:00.000000000', '2018-07-04T03:00:00.000000000',
       '2018-07-04T04:00:00.000000000', '2018-07-04T05:00:00.000000000',
       '2018-07-04T06:00:00.000000000', '2018-07-04T07:00:00.000000000',
       '2018-07-04T08:00:00.000000000', '2018-07-04T09:00:00.000000000',
       '2018-07-04T10:00:00.000000000', '2018-07-04T11:00:00.000000000',
       '2018-07-04T12:00:00.000000000', '2018-07-04T13:00:00.000000000',
       '2018-07-04T14:00:00.000000000', '2018-07-04T15:00:00.000000000',
       '2018-07-04T16:00:00.000000000', '2018-07-04T17:00:00.000000000',
       '2018-07-04T18:00:00.000000000', '2018-07-04T19:00:00.000000000',
       '2018-07-04T20:00:00.000000000', '2018-07-04T21:00:00.000000000',
       '2018-07-04T22:00:00.000000000', '2018-07-04T23:00:00.000000000',
       '2018-07-05T00:00:00.000000000', '2018-07-05T01:00:00.000000000',
       '2018-07-05T02:00:00.000000000', '2018-07-05T03:00:00.000000000',
       '2018-07-05T04:00:00.000000000', '2018-07-05T05:00:00.000000000',
       '2018-07-05T06:00:00.000000000', '2018-07-05T07:00:00.000000000',
       '2018-07-05T08:00:00.000000000', '2018-07-05T09:00:00.000000000',
       '2018-07-05T10:00:00.000000000', '2018-07-05T11:00:00.000000000',
       '2018-07-05T12:00:00.000000000', '2018-07-05T13:00:00.000000000',
       '2018-07-05T14:00:00.000000000', '2018-07-05T15:00:00.000000000',
       '2018-07-05T16:00:00.000000000', '2018-07-05T17:00:00.000000000',
       '2018-07-05T18:00:00.000000000', '2018-07-05T19:00:00.000000000',
       '2018-07-05T20:00:00.000000000', '2018-07-05T21:00:00.000000000',
       '2018-07-05T22:00:00.000000000', '2018-07-05T23:00:00.000000000',
       '2018-07-06T00:00:00.000000000', '2018-07-06T01:00:00.000000000',
       '2018-07-06T02:00:00.000000000', '2018-07-06T03:00:00.000000000',
       '2018-07-06T04:00:00.000000000', '2018-07-06T05:00:00.000000000',
       '2018-07-06T06:00:00.000000000', '2018-07-06T07:00:00.000000000',
       '2018-07-06T08:00:00.000000000', '2018-07-06T09:00:00.000000000',
       '2018-07-06T10:00:00.000000000', '2018-07-06T11:00:00.000000000',
       '2018-07-06T12:00:00.000000000', '2018-07-06T13:00:00.000000000',
       '2018-07-06T14:00:00.000000000', '2018-07-06T15:00:00.000000000',
       '2018-07-06T16:00:00.000000000', '2018-07-06T17:00:00.000000000',
       '2018-07-06T18:00:00.000000000', '2018-07-06T19:00:00.000000000',
       '2018-07-06T20:00:00.000000000', '2018-07-06T21:00:00.000000000',
       '2018-07-06T22:00:00.000000000', '2018-07-06T23:00:00.000000000',
       '2018-07-07T00:00:00.000000000', '2018-07-07T01:00:00.000000000',
       '2018-07-07T02:00:00.000000000', '2018-07-07T03:00:00.000000000',
       '2018-07-07T04:00:00.000000000', '2018-07-07T05:00:00.000000000',
       '2018-07-07T06:00:00.000000000', '2018-07-07T07:00:00.000000000',
       '2018-07-07T08:00:00.000000000', '2018-07-07T09:00:00.000000000',
       '2018-07-07T10:00:00.000000000', '2018-07-07T11:00:00.000000000',
       '2018-07-07T12:00:00.000000000', '2018-07-07T13:00:00.000000000',
       '2018-07-07T14:00:00.000000000', '2018-07-07T15:00:00.000000000',
       '2018-07-07T16:00:00.000000000', '2018-07-07T17:00:00.000000000',
       '2018-07-07T18:00:00.000000000', '2018-07-07T19:00:00.000000000',
       '2018-07-07T20:00:00.000000000', '2018-07-07T21:00:00.000000000',
       '2018-07-07T22:00:00.000000000', '2018-07-07T23:00:00.000000000',
       '2018-07-08T00:00:00.000000000', '2018-07-08T01:00:00.000000000',
       '2018-07-08T02:00:00.000000000', '2018-07-08T03:00:00.000000000',
       '2018-07-08T04:00:00.000000000', '2018-07-08T05:00:00.000000000',
       '2018-07-08T06:00:00.000000000', '2018-07-08T07:00:00.000000000',
       '2018-07-08T08:00:00.000000000', '2018-07-08T09:00:00.000000000',
       '2018-07-08T10:00:00.000000000', '2018-07-08T11:00:00.000000000',
       '2018-07-08T12:00:00.000000000', '2018-07-08T13:00:00.000000000',
       '2018-07-08T14:00:00.000000000', '2018-07-08T15:00:00.000000000',
       '2018-07-08T16:00:00.000000000', '2018-07-08T17:00:00.000000000',
       '2018-07-08T18:00:00.000000000', '2018-07-08T19:00:00.000000000',
       '2018-07-08T20:00:00.000000000', '2018-07-08T21:00:00.000000000',
       '2018-07-08T22:00:00.000000000', '2018-07-08T23:00:00.000000000',
       '2018-07-09T00:00:00.000000000', '2018-07-09T01:00:00.000000000',
       '2018-07-09T02:00:00.000000000', '2018-07-09T03:00:00.000000000',
       '2018-07-09T04:00:00.000000000', '2018-07-09T05:00:00.000000000',
       '2018-07-09T06:00:00.000000000', '2018-07-09T07:00:00.000000000',
       '2018-07-09T08:00:00.000000000', '2018-07-09T09:00:00.000000000',
       '2018-07-09T10:00:00.000000000', '2018-07-09T11:00:00.000000000',
       '2018-07-09T12:00:00.000000000', '2018-07-09T13:00:00.000000000',
       '2018-07-09T14:00:00.000000000', '2018-07-09T15:00:00.000000000',
       '2018-07-09T16:00:00.000000000', '2018-07-09T17:00:00.000000000',
       '2018-07-09T18:00:00.000000000', '2018-07-09T19:00:00.000000000',
       '2018-07-09T20:00:00.000000000', '2018-07-09T21:00:00.000000000',
       '2018-07-09T22:00:00.000000000', '2018-07-09T23:00:00.000000000',
       '2018-07-10T00:00:00.000000000', '2018-07-10T01:00:00.000000000',
       '2018-07-10T02:00:00.000000000', '2018-07-10T03:00:00.000000000',
       '2018-07-10T04:00:00.000000000', '2018-07-10T05:00:00.000000000',
       '2018-07-10T06:00:00.000000000', '2018-07-10T07:00:00.000000000',
       '2018-07-10T08:00:00.000000000', '2018-07-10T09:00:00.000000000',
       '2018-07-10T10:00:00.000000000', '2018-07-10T11:00:00.000000000',
       '2018-07-10T12:00:00.000000000', '2018-07-10T13:00:00.000000000',
       '2018-07-10T14:00:00.000000000', '2018-07-10T15:00:00.000000000',
       '2018-07-10T16:00:00.000000000', '2018-07-10T17:00:00.000000000',
       '2018-07-10T18:00:00.000000000', '2018-07-10T19:00:00.000000000',
       '2018-07-10T20:00:00.000000000', '2018-07-10T21:00:00.000000000',
       '2018-07-10T22:00:00.000000000', '2018-07-10T23:00:00.000000000',
       '2018-07-11T00:00:00.000000000', '2018-07-11T01:00:00.000000000',
       '2018-07-11T02:00:00.000000000', '2018-07-11T03:00:00.000000000',
       '2018-07-11T04:00:00.000000000', '2018-07-11T05:00:00.000000000',
       '2018-07-11T06:00:00.000000000', '2018-07-11T07:00:00.000000000',
       '2018-07-11T08:00:00.000000000', '2018-07-11T09:00:00.000000000',
       '2018-07-11T10:00:00.000000000', '2018-07-11T11:00:00.000000000',
       '2018-07-11T12:00:00.000000000', '2018-07-11T13:00:00.000000000',
       '2018-07-11T14:00:00.000000000', '2018-07-11T15:00:00.000000000',
       '2018-07-11T16:00:00.000000000', '2018-07-11T17:00:00.000000000',
       '2018-07-11T18:00:00.000000000', '2018-07-11T19:00:00.000000000',
       '2018-07-11T20:00:00.000000000', '2018-07-11T21:00:00.000000000',
       '2018-07-11T22:00:00.000000000', '2018-07-11T23:00:00.000000000',
       '2018-07-12T00:00:00.000000000', '2018-07-12T01:00:00.000000000',
       '2018-07-12T02:00:00.000000000', '2018-07-12T03:00:00.000000000',
       '2018-07-12T04:00:00.000000000', '2018-07-12T05:00:00.000000000',
       '2018-07-12T06:00:00.000000000', '2018-07-12T07:00:00.000000000',
       '2018-07-12T08:00:00.000000000', '2018-07-12T09:00:00.000000000',
       '2018-07-12T10:00:00.000000000', '2018-07-12T11:00:00.000000000',
       '2018-07-12T12:00:00.000000000'], dtype='datetime64[ns]')

 では、メソッド interp を適用します。キーワード引数 method には補間方法を代入します。ここでは、補間されていることが分かりやすいよう"nearest" を指定しますが、他に cubic や linear なども利用できます。どの補間が適切かはケースバイケースで検討してください。

In [24]:
# Script 22 #

Ttch = Ttc.interp(time=time1h,method="nearest")

 それではグラフを表示してみましょう。以下を実行してください。

In [25]:
# Script 23 #

linefig(Ttch)
No description has been provided for this image

 ここでは、時刻座標についての補間を説明しましたが、緯度、経度座標についても同じ考え方で補間処理をすることができます。

 さて、ソースデータを加工して作成したこのようなオリジナルなデータは、ほとんどの場合、ファイルとして保管することになります。DataArrayオブジェクトは、メソッド to_netcdf によりNetCDFファイルに保存することができます。

 以下を実行し、フォルダchallenge に、ファイル Ttch_202007011200.nc が作成されていることを確認してください。

In [26]:
# Script 24 #

Ttch.to_netcdf('Ttch_202007011200.nc')

2.5 時刻の取り扱い¶

 まず、下の図を見てください。これは、アメダス「東京」で2018年7月1日~15日に観測された気温と、これまで教材に使用してきた、2018年7月1日を初期値とする11日先までのGSM予報値を一つのグラフにプロットしたものです。

image.png

 一見して分かる通り、両者は日周期が一致していません。この理由は明白で、気象庁GPVデータが中央協定時(UTC)で記録されている一方、アメダスのデータは日本標準時(JST)で整理されているからです。アメダスに限らず独自の気象観測結果やビジネスで得られる時系列データの大部分は日本標準時に準拠しているので、気象庁のGPVデータを利活用する上では、異なる時刻の折り合いをつけることが避けられません。

 これへの対応には、大きく二つの方法が考えられます。一つは、GPVデータの時刻座標値を書き換えて日本時間にしてしまうこと、もう一つは、地方時を導入することです。前者は、一見手っ取り早そうですが、Xarrayのオブジェクトが深い連携を持つNetCDFファイルが時刻にUTCを使用する仕様を持っているため、時刻を付け直すことは、事柄が実際より9時間早く起きていたことにする という、少々深刻な改変を意味します。このため、オブジェクトを一から作り直さなければならないなど技術的に少々厄介なうえ、時刻を取り扱う他のシステムと連携する際に問題を引き起こすリスクを抱えます。したがって、"気象×○○" の探求の段階はともかく、実利用においてはお勧めできません。

 後者の「地方時の導入」とは、実際の時刻は別途保持したまま、タイムゾーンに応じた異なる時刻を表示するようプログラミングすることです。これは一見大変そうですが、Pythonのが標準で持つオブジェクト datetime や、これから説明するオブジェクト timestamp はこの機能をすでに持っているので実は簡単です。ただ、頭が痛いことに、オブジェクト DataArray や Dataset が使用する時刻オジェクト NumPy.datetime64[ns] にはこの機能がないので、後者ですべてすっきり、というわけでもありませんが、気象・ビジネスの推進を目指す私たちは、多少の不便は残りますが、後者を採用することにしましょう。

2.5.1 アメダスデータの読み込み¶

 アメダスデータをPythonで分析するには、ライブラリ Pandas を利用して、データを DataFrame オブジェクトで取り扱うのが便利です。具体的な手順等は「アメダスデータ分析チャレンジ!(Python版)」等でも学習しているので、ここでは、ごく簡単に説明します。
Dataframe は、リストや表になったデータを効率的に取り扱うことができるオブジェクトで、エクセルの「ワークシート」に近いものです。アメダスに限らず、CSVファイルで提供されるデータは、ほぼすべて Dataframe で取り扱えます。
CSVファイルで提供されるデータを読み込んで、DataFrame オブジェクトを生成するには、Pandasが提供する関数 read_csv を用います。

 それでは、気象庁の過去のデータ・ダウンロードのページ: https://www.data.jma.go.jp/gmd/risk/obsdl/ から入手した、アメダス「東京」における2018年7月の観測データ(下図)を読み込んで、DataFrameオブジェクトを実際に作成してみましょう。ファイルは、obs_tokyo_201807.csv の名でフォルダ challenge¥jamdata¥obs に用意してあるので、これを使用します。

image.png
気象庁のホームページからダウンロードしたCSVファイルの内容をテキストエディタで表示させた画面

 なお、気象庁のダウンロードページは、操作の順序により気象要素の並び順が変化することに注意して下さい。このファイルは、気温、降水量、相対湿度、蒸気圧の順序で並べられています。

 下に示すスクリプト(Script 25)は、CSVファイル obs_tokyo_201807.csv を読み込んで Dataframe オブジェクト df を生成するものです。CSVは、ファイルフォーマットの観点からはかなりいい加減なので、これに対応するため、read_csv には数えきれないほど沢山のオプションがあります。このスクリプトでは、以下を使用しています;

  • キーワード引数 encoding で文字コードを指定、
  • キーワード引数 skiprows でデータの上から5行目までを読みとばす、
  • キーワード引数 names で見出しを付け直し、
  • キーワード引数 index_col で1列目をインデックスに指定
  • キーワード引数 parse_dates で日付の文字列を timestamp オブジェクトに変換。
In [27]:
# Script 25 #

import pandas as pd
from pathlib import Path

data_root = Path("./jmadata")
obsdir = data_root/"obs" # アメダスデータのCSVファイルが保存されているフォルダ
obsfile = "obs_tokyo_201807.csv"
df = pd.read_csv( obsdir/obsfile, 
          encoding='Shift_JIS',
          skiprows=5,
          names=('TAo','TAQ','TAU', 'PRo','OPo','PRQ','PRU', 'RHo','RHQ','RHU', 'VPo','VPQ','VPU'), 
          index_col=0, parse_dates=True)



df
Out[27]:
TAo TAQ TAU PRo OPo PRQ PRU RHo RHQ RHU VPo VPQ VPU
2018-07-01 01:00:00 26.4 8 1 0.0 1 8 1 86 8 1 29.6 8 1
2018-07-01 02:00:00 26.1 8 1 0.0 1 8 1 88 8 1 29.8 8 1
2018-07-01 03:00:00 25.8 8 1 0.0 1 8 1 89 8 1 29.6 8 1
2018-07-01 04:00:00 25.6 8 1 0.0 1 8 1 90 8 1 29.6 8 1
2018-07-01 05:00:00 25.7 8 1 0.0 1 8 1 90 8 1 29.7 8 1
... ... ... ... ... ... ... ... ... ... ... ... ... ...
2018-07-15 20:00:00 28.3 8 1 0.0 1 8 1 82 8 1 31.6 8 1
2018-07-15 21:00:00 28.3 8 1 0.0 1 8 1 83 8 1 31.9 8 1
2018-07-15 22:00:00 27.7 8 1 0.0 1 8 1 87 8 1 32.3 8 1
2018-07-15 23:00:00 28.1 8 1 0.0 1 8 1 84 8 1 32.0 8 1
2018-07-16 00:00:00 27.9 8 1 0.0 1 8 1 83 8 1 31.2 8 1

360 rows × 13 columns

 通常はこれで完了ですが、これを気象庁のGPVデータと突き合わせると先に示したようなグラフとなります。そこで、もうひと作業を加え、DataFrame オブジェクトのインデックスの時刻は「日本標準時」という地方時で表現されていることを宣言します(表示とは裏腹にこれより9時間遅い時刻を内部的に持たせます)。これには、メソッド tz_localize を使います。

 上のスクリプト(Script 25)の15行目に、この文を挿入したのが下のスクリプト(Script 26)です。これを実行してください。

In [28]:
# Script 26 #

import pandas as pd
from pathlib import Path

data_root = Path("./jmadata")
obsdir = data_root/"obs" 
obsfile = "obs_tokyo_201807.csv"
df = pd.read_csv( obsdir/obsfile, 
          encoding='Shift_JIS',
          skiprows=5,
          names=('TAo','TAQ','TAU', 'PRo','OPo','PRQ','PRU', 'RHo','RHQ','RHU', 'VPo','VPQ','VPU'), 
          index_col=0, parse_dates=True)

df.index = df.index.tz_localize('Asia/Tokyo') #日本標準時を宣言

df
Out[28]:
TAo TAQ TAU PRo OPo PRQ PRU RHo RHQ RHU VPo VPQ VPU
2018-07-01 01:00:00+09:00 26.4 8 1 0.0 1 8 1 86 8 1 29.6 8 1
2018-07-01 02:00:00+09:00 26.1 8 1 0.0 1 8 1 88 8 1 29.8 8 1
2018-07-01 03:00:00+09:00 25.8 8 1 0.0 1 8 1 89 8 1 29.6 8 1
2018-07-01 04:00:00+09:00 25.6 8 1 0.0 1 8 1 90 8 1 29.6 8 1
2018-07-01 05:00:00+09:00 25.7 8 1 0.0 1 8 1 90 8 1 29.7 8 1
... ... ... ... ... ... ... ... ... ... ... ... ... ...
2018-07-15 20:00:00+09:00 28.3 8 1 0.0 1 8 1 82 8 1 31.6 8 1
2018-07-15 21:00:00+09:00 28.3 8 1 0.0 1 8 1 83 8 1 31.9 8 1
2018-07-15 22:00:00+09:00 27.7 8 1 0.0 1 8 1 87 8 1 32.3 8 1
2018-07-15 23:00:00+09:00 28.1 8 1 0.0 1 8 1 84 8 1 32.0 8 1
2018-07-16 00:00:00+09:00 27.9 8 1 0.0 1 8 1 83 8 1 31.2 8 1

360 rows × 13 columns

 インデックス(時刻の列)に注目してください。時刻表示の後ろに「+09:00」が付加されました。これで、日本標準時を表示しながらも、内部的な時刻がUTCとなりました。

 それでは、このDataFrameから時刻と気温を取り出して、GSM-GPVの気温とともにプロットしてみましょう。まず、2.4 で保存した時別気温のDataArrayオブジェクトをファイルからロードします。以下を実行してください。

In [29]:
# Script 27 #

import xarray as xr

with xr.open_dataarray('Ttch_202007011200.nc') as Ttch:
    Ttch.load()

 次いで、DataFrame オブジェクト df から時刻と気温を取り出し、Ttch とともにプロットします。
以下を実行してください。

In [30]:
# Script 28 #

#折れ線グラフ========
import matplotlib.pyplot as plt  # グラフを描画するためのモジュールのインポート
dat = Ttch

# '台紙'のオブジェクトfigと、'図柄'のオブジェクトaxの生成
fig, ax = plt.subplots(figsize=(15,5),ncols=1,nrows=1)
ax.set_xlabel("Date")
ax.set_ylabel(dat.attrs["long_name"] + "  (" + dat.attrs["units"] + ")")
ax.set_title("")

#GSM-GPVの折れ線
ax.plot(dat["time"], dat.T, color='black',label='GSM-GPV at N35.60,E139.75') 

#実況値の折れ線
xobs = df.index  # dfのインデックスを x 軸に選ぶ
yobs = df["TAo"] # dfの列"TAo"を y 軸に選ぶ
ax.plot(xobs, yobs, color='red', linewidth=1,label='AMeDAS Tokyo at N35.6916,E139.7516')

# 凡例
ax.legend(loc='lower left')

plt.show()
No description has been provided for this image

 今度は時刻が揃いました(値そのものは一致していませんが)。

 アメダスデータの時刻をUTCに修正したので、見た目上、アメダスの気温(赤)が左にずれてもよさそうですが、これは変化せず、GSM-GPV(黒)の線が右にずれていることに注目してください。ブラフの横軸の目盛が、日本標準時で振られているからです。地方時を導入することにより、グラフにおいても、データが指し示す時刻は中央協定時としながら目盛りを日本標準時とすることができました。

2.5.2 DataArrayオブジェクトの時刻¶

 この章の冒頭で説明した通り、DataArrayオブジェクトやDatasetオブジェクトが使用する時間オブジェクト Numpy.datetime64 は、地方時を取り扱えません。このため、属性 time で得られる時刻の表示は常にUTCです。しかし、これを別なオブジェクトにコピーして日本標準時を表示させるのは比較的簡単です。
下のCellに、ライブラリ Pandas の力を借りて日本標準時の timestamp オブジェクトのリストを得る方法を示します。実行してみてください。

In [31]:
# Script 29 #

import pandas as pd

t_dt64 = Ttch.time   #DataArrayオブジェクトの時刻座標を取り出す(Numpy.datetime64型の配列)

s_tstmp = pd.Series(t_dt64)   #Pandasの関数を使ってtimesampオブジェクトのSeriesに変換する

s_uct = s_tstmp.dt.tz_localize('UTC')   #配列の時刻がUTCであることを宣言する

s_jst = s_uct.dt.tz_convert('Asia/Tokyo')   #JSTで表現するよう指定する

t_jst = list(s_jst)   #Seriesをリストに変換する

t_jst
Out[31]:
[Timestamp('2018-07-01 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-01 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-01 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 21:00:00+0900', tz='Asia/Tokyo')]

 上の処理は下記のように1行で書いてしまうこともできます。

list(pd.Series(Ttch.time).dt.tz_localize('UTC').dt.tz_convert('Asia/Tokyo'))

 これを利用して、日本標準時を横軸とする折れ線グラフ描画関数 linefig_jst を以下のように作ることができます。

In [32]:
# Script 30 #

import matplotlib.pyplot as plt  # グラフを描画するためのモジュールのインポート
import pandas as pd

def linefig_jst(dataarr):
    jst = pd.Series(dataarr.time).dt.tz_localize('UTC').dt.tz_convert('Asia/Tokyo')
    fig, ax = plt.subplots(figsize=(15,5),ncols=1,nrows=1)
    ax.set_xlabel(dataarr["time"].attrs["long_name"])
    ax.set_ylabel(dataarr.attrs["long_name"] + "  (" + dataarr.attrs["units"] + ")")
    ax.set_title("latitude = "+str(dataarr["latitude"].data)+", longitude = "+str(dataarr["longitude"].data))
    ax.plot(jst, dataarr.T)
    plt.show()
In [33]:
# Script 31 #

linefig_jst(Ttch)
No description has been provided for this image

 wxbcgribX の関数 jst は、 DataArray や Datasetオブジェクトから時刻を日本標準時で取り出すことができます。(Script 29 を関数化しただけですが・・・)

In [34]:
# Script 32 #

import wxbcgribx as wx

wx.jst(Ttch)
Out[34]:
[Timestamp('2018-07-01 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-01 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-01 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-02 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-03 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-04 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-05 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-06 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-07 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-08 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-09 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-10 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 21:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 22:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-11 23:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 00:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 01:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 02:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 03:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 04:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 05:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 06:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 07:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 08:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 09:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 10:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 11:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 12:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 13:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 14:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 15:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 16:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 17:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 18:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 19:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 20:00:00+0900', tz='Asia/Tokyo'),
 Timestamp('2018-07-12 21:00:00+0900', tz='Asia/Tokyo')]

2.6 数値予報データの利用に向けて¶

 これまで、気象庁のGPVデータを教材に、Pythonでの処理技術について学んできました。さて、それでは、これらはビジネスのどのような場面で活用が期待できるでしょうか。ここでは、数値予報GPVプロダクトに限って考察をしてみましょう。

 気象庁の数値予報GPVデータの特徴は以下のようにまとめることができます。

image.png

 そして、この特徴を生かした利用場面としては、以下の2つがあげられるます。

image.png

1. 気象との関係が明らかな事象を任意の地点で予測する¶

  1. の例として、国立研究開発法人 農業・食品産業技術総合研究機構が研究を進める栽培管理支援システムを示します。これは、果樹の開花日等作物の発育や、病害の発生リスク、品質を損なわない収穫期などを各農家に対して行うものです。気象予測のほかに、作物と気象との関係の知見と、栽培管理技術があってはじめて成立します。 image.png

 農研機構は、このシステムを運用するのために農研機構メッシュ農業気象データシステム( https://amu.rd.naro.go.jp )を運用しており、そこで気象庁の数値予報モデルGPVデータが、他の気象データとともに使われています。

image.png

 このような利用法においては、現地で観測した気象値にできるだけ近いものを全国で用意することが重要となります。各種プロダクトを上手に組み合わせたり誤差の補正を工夫したりして、メッシュサイズをより細かく、系統誤差の補正精度をより高くすることが、努力の方向性となります。

2. 領域に対して定義される事象を予測する¶

 2.の例として、この研修に先立って開催されたアメダスデータ分析チャレンジ! を紹介します。ここでは、東京電力管内の電力消費量を教材に気温や曜日等との関係を分析し、以下を導きました。

image.png

 そして、これに基づいて、アメダス「東京」の気温を説明変数とする以下のような重回帰モデルで消費量を推定しました。

image.png

 このモデルに気温の観測値でなく予報値を使用すれば、数日先の電力消費量を予測することができます。 しかし、それを実現するために以下のようなプロセスをとることは得策ではありません。

  1. アメダス「東京」に最も近いグリッドを調べる
  2. そのグリッドの気温と観測値を比較して、数値予報データの補正式を得る
  3. 補正式で推定した気温予報値をモデルの X1 に入力する

 電力消費量と気温の間には物理法則はなく、様々な要因や偶然が重なったうえでの相関関係があるだけなので、利用ケース1とは異なり、地上気温に固執する必然性はありません。また、数値予報データは面的に用意されているのですから、より多くのグリッドのデータを使わない手はありません。したがって、領域に対して定義される量を予測するにあたり、メッシュ気象データの特性を生かすには、以下のような工夫が考えられます。

image.png

 あるいは、さらに一歩進んで、アメダスデータ分析チャレンジで得た知見を活用して、電力消費量との相関が大きいメッシュを探す分析も考えられます。いずれにしても、メッシュ気象データをビジネスで有効に活用するためには、他の地理情報との組み合わせがポイントとなるでしょう。また、回帰分析や系統的誤差補正を行うに十分な量の数値予報モデルGPVデータが必要となります。

 前者については、オープンで高機能なGIS( https://qgis.org/ja/site/ )が誰でも利用可能です。オープンな地理情報も少しづつ増えているので、こちらもぜひ学んでみてください。
後者については、残念ながら、現時点では、気象業務支援センターや気象事業者と契約し費用をかけて配信を受け、データを蓄積してから分析にとりかかるしかありません。気象庁には、動作確認のサンプルだけでなく、ビジネス利用に向けたデータ分析に使用可能なアーカイブについても提供していただきたいものです。

おわりに¶

 この研修では、気象庁が配信するGPVデータをGRIB2ファイルから取り出す方法と、プログラミング言語Pythonプログラミング言語Pythonを利用してそれを処理し、グラフや分布図として図化する方法や地方時を取り扱う方法を学びました。さらに、数値予報モデルGPVのビジネス利用にむけて、簡単ですが考察を加えました。
今回の研修で、数値予報モデルGPVをはじめとする気象庁の様々なメッシュ気象データのビジネス利用のハードルが少しでも下がれば、私たちとしては嬉しいです。

著作権について¶

Copyright 2023 気象ビジネス推進コンソーシアム
(C) 2023 WXBC


<利用条件>
本書は、本書に記載した要件・技術・方式に関する内容が変更されないこと、および出典を明示いただくことを前提に、無償でその全部または一部を複製、翻案、翻訳、転記、引用、公衆送信等して利用できます。なお、全体または一部を複製、翻案、翻訳された場合は、本書にある著作権表示および利用条件を明示してください。

<免責事項>
本書の著作権者は、本書の記載内容に関して、その正確性、商品性、利用目的への適合性等に関して保証するものではなく、特許権、著作権、その他の権利を侵害していないことを保証するものでもありません。本書の利用により生じた損害について、本書の著作権者は、法律上のいかなる責任も負いません。