[PYTHON] Konvertieren Sie Wetterdaten im GRIB2-Format, die mit pygrib nicht geöffnet werden können, in netCDF und visualisieren Sie sie

Konvertieren Sie Wetterdaten im GRIB2-Format, die mit pygrib nicht geöffnet werden können, in netCDF und visualisieren Sie sie

Einführung

Das "GRIB2" -Format ist der Industriestandard für das Format meteorologischer Daten mit zweidimensionaler Verbreitung. Es gibt eine detaillierte Einführung von @e_toyoda zum GRIB2-Format. Informationen zum Rasterdatenformat GRIB2 der WMO (World Meteorological Organization)

Es gibt verschiedene Tools zum Lesen von Daten aus Dateien im GRIB2-Format. Für Python können Sie ein Modul namens pygrib verwenden.

Da das nationale synthetische Radar und die geschätzte Wetterverteilung landesweit Daten in Intervallen von 1 km sind, ist die Datenmenge groß, und im Gegensatz zu GSM und MSM wird das von der Japan Meteorological Agency eindeutig festgelegte Komprimierungsformat verwendet. .. Dies scheint von pygrib nicht unterstützt zu werden und es gibt einige Daten, die nicht geöffnet werden können.

Ich möchte ein Deep Learning-Programm mit diesen Daten mit Keras erstellen, damit ich mit Python damit umgehen kann. Daher habe ich es in das netCDF-Format konvertiert, das von Python mit einem Tool namens wgrib2 verarbeitet werden kann, das das Meteorological Agency-Format unterstützt.

Nationales synthetisches Radar, das mit Pygrib nicht geöffnet werden kann

Das nationale synthetische Radar wurde vom Kyoto University Living Area Research Institute heruntergeladen. Wenn ich diese Datendatei mit pygrib öffne, wird folgende Fehlermeldung angezeigt:

>>> import pygrib
>>> grbs=pygrib.open("Z__C_RJTD_20200207000000_RDR_JMAGPV_Ggis1km_Prr10lv_ANAL_grib2.bin")
ECCODES ERROR   :  Unable to find template productDefinition from grib2/template.4.50008.def 
ECCODES ERROR   :  Unable to find template productDefinition from grib2/template.4.50008.def 

Dies liegt wahrscheinlich daran, dass die von der Meteorologischen Agentur verwendete Definition in pygrib nicht existiert.

Konvertierung mit wgrib2

wgrib2

Für wgrib2 hat @ysomei es unten zusammengefasst. Es ist ein Tool der US-amerikanischen "Atmosphere and Ocean Agency (NOAA)". Ich habe gerade die Wetterdaten analysiert

Es gibt verschiedene Optionen und Sie können verschiedene Dinge tun. Beispielsweise können Sie den Inhalt der GRIB-Datei wie folgt in CSV ausgeben. Mit Ausnahme der erstellten CSV-Datei sind "var0_1_201" und "Oberfläche" in der Beschriftung enthalten, die die Daten angibt. Die letzten drei Elemente sind Längengrad, Breitengrad und Daten („Datenrepräsentativer Wert“).

python


> wgrib2 -V GRIB_formatted_file -csv tmp.csv
> cat tmp.csv
Abkürzung
"2020-02-07 00:00:00","2020-02-07 00:00:00","var0_1_201","surface",121.919,22.6875,7.25
"2020-02-07 00:00:00","2020-02-07 00:00:00","var0_1_201","surface",121.931,22.6875,16.5
"2020-02-07 00:00:00","2020-02-07 00:00:00","var0_1_201","surface",121.944,22.6875,9.25
"2020-02-07 00:00:00","2020-02-07 00:00:00","var0_1_201","surface",121.956,22.6875,0
"2020-02-07 00:00:00","2020-02-07 00:00:00","var0_1_201","surface",121.969,22.6875,0
Unterlassung

Synthetisches Radardatenformat (Datenrepräsentativwert und Pegelwert)

Die Einheit des "Datenrepräsentativwerts" des synthetischen Radars ist mm / h, was die Niederschlagsintensität ist. In der ursprünglichen GRIB2-Formatdatei ist kein direkter Niederschlagsintensitätswert festgelegt, sondern ein Wert von 0 bis 251, der als "Pegelwert" bezeichnet wird. Zum Beispiel bedeutet ein "Pegelwert" von "37", dass die Niederschlagsintensität "7,0 mm / h oder mehr und weniger als 7,5 mm / h" beträgt. Der "Datenrepräsentativwert" beträgt "7,75 mm / h".

Mit anderen Worten, es gibt eine Konvertierungstabelle von "Ebenenwert" zu "Datenrepräsentativwert", aber wgrib2 scheint dies auch zu tun (obwohl wgrib2 nicht entschlüsselt wurde).

Konvertierung in das NetCDF-Format

Verwenden Sie die folgenden Optionen, um mit wgrib2 von GRIB2 in das netCDF-Format zu konvertieren.

wgrib.sh


wgrib2 GRIB_formatted_file -netcdf GRIB_formatted_file.nc

Dadurch wird eine Datei im NetCDF-Format erstellt. Beachten Sie jedoch, dass die Dateigröße dramatisch zunimmt, wahrscheinlich weil die Komprimierung freigegeben wird.

ls


235702   Z__C_RJTD_20200207000000_RDR_JMAGPV_Ggis1km_Prr10lv_ANAL_grib2.bin
34454836 Z__C_RJTD_20200207000000_RDR_JMAGPV_Ggis1km_Prr10lv_ANAL_grib2.bin.nc

Lesen von Daten mit netCDF4 mit Python

Diese Datei kann mit dem Python-Modul netCDF4 wie folgt behandelt werden.

netcdf4_open.py


from netCDF4 import Dataset
(Ausgelassen)

nc = Dataset( fn , 'r' )
xx = nc.variables['longitude'][:] #
yy = nc.variables['latitude' ][:] #
data = nc.variables['var0_1_201_surface'][:]
lons, lats = np.meshgrid( xx , yy )
        
_save_file = savefilenamelist[ptr_sfile]

drawmap( data[0,:,:] , levels_rai , precip_colormap , _save_file ,_flag_show , "RAIN" , norm)

Wir haben "var0_1_201_surface" angegeben, um die in der Datei enthaltenen Daten zu identifizieren. Als ich mit wgrib2 auf den Inhalt der GRIB-Datei verwies, schien sie in "var0_1_201" und "Oberfläche" unterteilt zu sein, aber als ich sie in eine NetCDF-Datei konvertierte, schien sie in die Bezeichnung "var0_1_201_surface" konvertiert zu werden. Wie unten gezeigt, erscheint diese Bezeichnung bei der Ausgabe der netcdf-Datei als Information am Ende von "Variablen".

DumpNetCDF


>>> from netCDF4 import Dataset
>>> nc=Dataset("Z__C_RJTD_20200207000000_RDR_JMAGPV_Ggis1km_Prr10lv_ANAL_grib2.bin.nc",'r')
>>> nc
<class 'netCDF4._netCDF4.Dataset'>
root group (NETCDF3_CLASSIC data model, file format NETCDF3):
    Conventions: COARDS
    History: created by wgrib2
    GRIB2_grid_template: 0
    dimensions(sizes): latitude(3360), longitude(2560), time(1)
    variables(dimensions): float64 latitude(latitude), float64 longitude(longitude), 
    float64 time(time), float32 var0_1_201_surface(time,latitude,longitude)
    groups:

Visualisierung

Dies ist die zu visualisierende Python-Quelle. Ich benutze Matplotlib.

Obwohl es sich um ein Front-Miso handelt, ist dies und das der Visualisierung [versuchen Sie, durch maschinelles Lernen auf der Grundlage meteorologischer Daten eine "wetterkartenähnliche Front" zu zeichnen (2) Geschichte der Visualisierung meteorologischer Daten als Eingabe](https: // qiita. com / m-taque / items / 988b08185097dca5f5b5 "Zeichnen einer" wetterkartenähnlichen Front "basierend auf meteorologischen Daten durch maschinelles Lernen (2) Die Geschichte der Visualisierung meteorologischer Daten als Eingabe"). Da die zu visualisierende Farbkarte einen Weißbereich hat, ist die Karte selbst in der folgenden Visualisierung leicht gefärbt. Die Reihenfolge der Überlagerung der farbigen Karte und der Konturkarte wird durch die Reihenfolge festgelegt.

draw_routine


def drawmap( values , levels , cmap , _save_filename , flag_show , name ,norm) :
        fig,ax = plt.subplots(figsize=(5,5))
        plt.subplots_adjust(left=0.02, right=0.98, top=0.98, bottom=0.02)
     
        m = Basemap(projection='stere', llcrnrlat=25, urcrnrlat=47, llcrnrlon=125, urcrnrlon=150, lat_0=60,  lon_0=140, resolution='i' )
        
        m.drawparallels(np.arange(-80.,81.,10.))
        m.drawmeridians(np.arange(-180.,181.,10.))
        m.drawcoastlines()
        m.drawmapboundary(fill_color='#eeeeee' , zorder=-1)
        m.fillcontinents(color='#ceceee' , zorder=-1)
        
        x , y = m(lons, lats)

        m.contourf( x , y , values , levels , cmap=cmap , zorder=0 , norm=norm )

        fig.savefig(_save_filename)
        if flag_show == 'yes' :
                plt.show()
        plt.close()

Sie können ein Bild wie das unten gezeigte erstellen (UTC-Daten am 8. September 2019 um 15:00 Uhr).

gsrd.v5.201909081500.png

Zusammenfassung

Beschrieben, wie eine Datei im GRIB2-Format konvertiert wird, die jedoch nicht von pygrib in das netCDF-Format verarbeitet werden kann, damit sie von Python verarbeitet werden kann.

Recommended Posts

Konvertieren Sie Wetterdaten im GRIB2-Format, die mit pygrib nicht geöffnet werden können, in netCDF und visualisieren Sie sie
Konvertieren Sie aus SpriteUV2 exportierte Netzdaten in ein Format, das von Spine importiert werden kann
Beispiele und Lösungen, die mit scipy.optimize.least_squares nicht gut optimiert werden können
Konvertieren Sie eine Tabelle in CSV und laden Sie sie mit Cloud-Funktionen in den Cloud-Speicher hoch
Lesen Sie die CSV-Datei mit Python und konvertieren Sie sie unverändert in DataFrame
Es wurde ein Fehler behoben, bei dem node.surface mit python3 + mecab nicht abgerufen werden konnte
Konvertieren Sie Excel-Daten mit Python in JSON
Angelegenheiten, die mit sklearn nicht importiert werden können
Konvertieren Sie das PDF des mobilen Suica-Nutzungsverlaufs mit tabula-py in das Pandas-Datenrahmenformat
Formatieren Sie DataFrame-Daten mit Pytorch in ein Formular, das mit NN trainiert werden kann