[PYTHON] Convertissez les données météorologiques au format GRIB2 qui ne peuvent pas être ouvertes avec pygrib en netCDF et visualisez-les

Convertissez les données météorologiques au format GRIB2 qui ne peuvent pas être ouvertes avec pygrib en netCDF et visualisez-les

introduction

Le format "GRIB2" est la norme de l'industrie pour le format des données météorologiques avec une diffusion bidimensionnelle. Il y a une introduction détaillée par @e_toyoda sur le format GRIB2. À propos du format de données de grille GRIB2 de l'OMM (Organisation météorologique mondiale)

Il existe différents outils pour lire des données à partir de fichiers au format GRIB2. Pour python, vous pouvez utiliser un module appelé pygrib.

Cependant, étant donné que le radar synthétique national et la distribution météorologique estimée sont des données à des intervalles de 1 km dans tout le pays, la quantité de données est importante et, contrairement au GSM et au MSM, le format de compression uniquement spécifié par l'Agence météorologique japonaise est utilisé. .. Cela ne semble pas être pris en charge par pygrib et certaines données ne peuvent pas être ouvertes.

Je souhaite créer un programme de Deep Learning en utilisant ces données avec Keras, je veux donc pouvoir le gérer avec python. Par conséquent, je l'ai converti au format netCDF qui peut être géré par python à l'aide d'un outil appelé wgrib2 qui prend en charge le format Meteorological Agency.

Radar synthétique national qui ne peut pas être ouvert avec pygrib

Le radar synthétique national a été téléchargé depuis Institut de recherche sur la zone de vie de l'Université de Kyoto. Lorsque j'ouvre ce fichier de données avec pygrib, j'obtiens l'erreur suivante:

>>> 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 

C'est probablement parce que la définition utilisée par l'Agence météorologique n'existe pas dans pygrib.

Conversion à l'aide de wgrib2

wgrib2

Pour wgrib2, @ysomei l'a résumé ci-dessous. Il s'agit d'un outil fourni par la "Atmosphere and Ocean Agency (NOAA)" américaine. Je viens d'analyser les données météorologiques

Il existe différentes options et vous pouvez faire différentes choses. Par exemple, vous pouvez exporter le contenu du fichier GRIB au format CSV comme suit. À l'exception du fichier CSV créé, «var0_1_201» et «surface» sont inclus dans l'étiquette qui spécifie les données. Les trois derniers éléments sont la longitude, la latitude et les données («valeur représentative des données»).

python


> wgrib2 -V GRIB_formatted_file -csv tmp.csv
> cat tmp.csv
Abréviation
"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
Omission

Format de données radar synthétique (valeur représentative des données et valeur de niveau)

L'unité de «valeur représentative des données» du radar synthétique est le mm / h, qui est l'intensité des précipitations. Le fichier au format GRIB2 d'origine n'a pas de valeur d'intensité de pluie directe définie, mais une valeur de 0 à 251 appelée «valeur de niveau». Par exemple, une «valeur de niveau» de «37» signifie que l'intensité des précipitations est de «7,0 mm / h ou plus et inférieure à 7,5 mm / h». La "valeur représentative des données" est "7,75 mm / h".

En d'autres termes, il existe une table de conversion de la «valeur de niveau» à la «valeur représentative des données», mais wgrib2 semble le faire également (bien que wgrib2 n'ait pas été déchiffré).

Conversion au format NetCDF

Utilisez les options suivantes pour convertir du format GRIB2 au format netCDF à l'aide de wgrib2.

wgrib.sh


wgrib2 GRIB_formatted_file -netcdf GRIB_formatted_file.nc

Cela créera un fichier au format netCDF. Cependant, veuillez noter que la taille du fichier augmentera considérablement, probablement parce que la compression est libérée.

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

Lecture de données en utilisant netCDF4 avec python

Ce fichier peut être manipulé comme suit à l'aide du module python netCDF4.

netcdf4_open.py


from netCDF4 import Dataset
(Omis)

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)

Nous avons spécifié var0_1_201_surface pour identifier les données contenues dans le fichier. Quand j'ai fait référence au contenu du fichier GRIB avec wgrib2, il semblait être divisé en var0_1_201 et surface, mais lorsque je l'ai converti en fichier NetCDF, il semble être converti en l'étiquette var0_1_201_surface. Comme indiqué ci-dessous, lorsque le fichier netcdf est sorti comme information, cette étiquette apparaît à la fin de variables.

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:

Visualisation

C'est la source python à visualiser. J'utilise matplotlib.

Bien qu'il s'agisse d'un front miso, ceci et cela de la visualisation est [essayez de dessiner un "front de type carte météorologique" par apprentissage automatique basé sur des données météorologiques (2) Histoire de la visualisation des données météorologiques en entrée](https: // qiita. com / m-taque / items / 988b08185097dca5f5b5 "Dessiner un" front de type carte météo "basé sur des données météorologiques par apprentissage automatique (2) L'histoire de la visualisation des données météorologiques en entrée"). Étant donné que la carte de couleurs à visualiser a une plage blanche, la carte elle-même est légèrement colorée dans la visualisation ci-dessous. L'ordre de superposition de la carte colorée et de la carte de contour est spécifié par zorder.

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()

Vous pouvez créer une image comme celle ci-dessous (données UTC à 15h00 le 8 septembre 2019).

gsrd.v5.201909081500.png

Résumé

Décrit comment convertir un fichier au format GRIB2 mais qui ne peut pas être géré par pygrib au format netCDF afin qu'il puisse être géré par python.

Recommended Posts

Convertissez les données météorologiques au format GRIB2 qui ne peuvent pas être ouvertes avec pygrib en netCDF et visualisez-les
Convertir les données de maillage exportées de SpriteUV2 dans un format pouvant être importé par Spine
Exemples et solutions qui ne peuvent pas être optimisés avec scipy.optimize.least_squares
Convertissez la feuille de calcul en CSV et importez-la dans Cloud Storage avec Cloud Functions
Lisez le fichier CSV avec Python et convertissez-le en DataFrame tel quel
Correction d'un bug où node.surface ne pouvait pas être obtenu avec python3 + mecab
Convertir des données Excel en JSON avec python
Convertissez des données FX 1 minute en données 5 minutes avec Python
Matières qui ne peuvent pas être importées avec sklearn
Convertissez l'historique d'utilisation de Suica mobile au format PDF au format pandas Data Frame avec tabula-py
Formatez les données DataFrame avec Pytorch sous une forme pouvant être entraînée avec NN