Ici, les fichiers suivants dans Liste d'exemples de données de l'Agence météorologique sont ciblés.
--Modèle de prévision numérique global GPV (GSM) --Meso modèle de prévision numérique GPV (MSM) --Modèle de prévision numérique local GPV (LFM)
Les deux adoptent un format binaire appelé GRIB2.
J'ai utilisé l'environnement virtuel d'Anaconda.
Comme le titre de l'article le suggère, utilisez pygrib. Peut être installé à partir de pip ou conda.
conda install -c conda-forge pygrib
Obtenir la température [℃] du stade Jingu (35,6745, 139,7169) (point de maille le plus proche) à chaque instant (JST) à partir du fichier échantillon (MSM) de l'Agence météorologique.
from datetime import timedelta
import pygrib
import pandas as pd
time_diff = timedelta(hours=9)
gpv_file = pygrib.open("Z__C_RJTD_20171205000000_MSM_GPV_Rjp_Lsurf_FH00-15_grib2.bin")
t_messages = gpv_file.select(name="Temperature")
df = pd.DataFrame({
"validDate": [msg.validDate + time_diff for msg in t_messages],
"temperature": [
msg.data(
lat1=35.6745-0.025,
lat2=35.6745+0.025,
lon1=139.7169-0.03125,
lon2=139.7169+0.03125,
)[0][0][0] - 273.15 for msg in t_messages
]
})
print(df)
↓ Résultat de sortie
validDate temperature
0 2017-12-05 09:00:00 9.810709
1 2017-12-05 10:00:00 11.409219
2 2017-12-05 11:00:00 12.358789
3 2017-12-05 12:00:00 13.116861
4 2017-12-05 13:00:00 13.770517
5 2017-12-05 14:00:00 14.698541
6 2017-12-05 15:00:00 14.488687
7 2017-12-05 16:00:00 13.063196
8 2017-12-05 17:00:00 11.467722
9 2017-12-05 18:00:00 10.320886
10 2017-12-05 19:00:00 9.592111
11 2017-12-05 20:00:00 8.797952
12 2017-12-05 21:00:00 8.171686
13 2017-12-05 22:00:00 7.832407
14 2017-12-05 23:00:00 7.461450
15 2017-12-06 00:00:00 6.884409
pygrib.open Créez une interface avec le fichier en utilisant la classe.
import pygrib
gpv_file = pygrib.open("Z__C_RJTD_20171205000000_MSM_GPV_Rjp_Lsurf_FH00-15_grib2.bin")
--L'instance pygrib.open
elle-même est l'itérateur de l'instance pygrib.gribmessage
--Peut être utilisé comme interface pour extraire des informations spécifiques contenues dans un fichier en tant qu'instance pygrib.gribmessage
ou sa liste (réutilisable)
pygrib.gribmessage
sera décrit plus tard.Prend l'argument N
(int) et renvoie la Nième (1 origine) instance pygrib.gribmessage
sur l'itérateur.
In[]
gpv_file.message(2)
↓
Out[]
2:Surface pressure:Pa (instant):regular_ll:surface:level 0:fcst time 0 hrs:from 201712050000
Prend un argument sous la forme «** kwargs» et renvoie une liste de «pygrib.gribmessage» qui correspond à cette condition.
Si plusieurs conditions de recherche sont spécifiées, elles sont évaluées en tant que conditions AND.
--1 condition
In[]
gpv_file.select(name="Temperature")
↓
Out[]
[5:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 0 hrs:from 201712050000,
15:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 1 hrs:from 201712050000,
27:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 2 hrs:from 201712050000,
39:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 3 hrs:from 201712050000,
51:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 4 hrs:from 201712050000,
63:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 5 hrs:from 201712050000,
75:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 6 hrs:from 201712050000,
87:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 7 hrs:from 201712050000,
99:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 8 hrs:from 201712050000,
111:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 9 hrs:from 201712050000,
123:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 10 hrs:from 201712050000,
135:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 11 hrs:from 201712050000,
147:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 12 hrs:from 201712050000,
159:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 13 hrs:from 201712050000,
171:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 14 hrs:from 201712050000,
183:Temperature:K (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 15 hrs:from 201712050000]
--2 conditions
In[]
gpv_file.select(shortName="r", forecastTime=3)
↓
Out[]
[40:Relative humidity:% (instant):regular_ll:heightAboveGround:level 1.5 m:fcst time 3 hrs:from 201712050000]
Les éléments qui peuvent être utilisés dans la pratique pour les conditions de recherche sont les suivants.
nom de l'article | Type d'entrée |
---|---|
name | str |
shortName | str |
forecastTime(※) | int |
validDate | datetime.datetime |
parameterCategory | int |
parameterNumber(※※) | int |
ParameterNumber
doit être utilisé en combinaison avec parameterCategory
Le pygrib.gribmessage extrait ci-dessus contient ** des données pour tous les maillages d'un certain temps et élément de données ** C'est inclus.
Nom de variable | Moule | Contenu |
---|---|---|
validDate | datetime.datetime | Date et heure de prévision(UTC) |
analDate | datetime.datetime | Date et heure de référence de l'analyse des prévisions(UTC) |
forecastTime | int | analDate DevalidDate Décalage horaire à |
distinctLatitudes | numpy.ndarray | Liste des latitudes maillées(1 dimension) |
distinctLongitudes | numpy.ndarray | Liste des longitudes de maillage(1 dimension) |
values | numpy.ndarray | Liste des valeurs de données pour tous les maillages(2D) |
Renvoie une liste des latitudes et longitudes de maillage pour chaque maillage. Les deux types de retour sont «numpy.ndarray».
In[]
message = gpv_file.message(2)
lats, lons = message.latlons()
Out[]
# lats
array([[47.6 , 47.6 , 47.6 , ..., 47.6 , 47.6 , 47.6 ],
[47.55, 47.55, 47.55, ..., 47.55, 47.55, 47.55],
[47.5 , 47.5 , 47.5 , ..., 47.5 , 47.5 , 47.5 ],
...,
[22.5 , 22.5 , 22.5 , ..., 22.5 , 22.5 , 22.5 ],
[22.45, 22.45, 22.45, ..., 22.45, 22.45, 22.45],
[22.4 , 22.4 , 22.4 , ..., 22.4 , 22.4 , 22.4 ]])
# lons
array([[120. , 120.0625, 120.125 , ..., 149.875 , 149.9375, 150. ],
[120. , 120.0625, 120.125 , ..., 149.875 , 149.9375, 150. ],
[120. , 120.0625, 120.125 , ..., 149.875 , 149.9375, 150. ],
...,
[120. , 120.0625, 120.125 , ..., 149.875 , 149.9375, 150. ],
[120. , 120.0625, 120.125 , ..., 149.875 , 149.9375, 150. ],
[120. , 120.0625, 120.125 , ..., 149.875 , 149.9375, 150. ]])
Il semble que l'ordre soit tel que le cas où il est écrit sous forme de matrice et le cas où il est affiché sur une carte correspondent visuellement.
Obtenez la valeur des données du maillage dans la plage des arguments «lat1» (latitude minimale), «lat2» (latitude maximale), «lon1» (longitude minimale) et «lon2» (longitude maximale) et la latitude / longitude de ce maillage. Faire. En ce qui concerne la valeur de retour, le "numpy.ndarray" bidimensionnel en forme de maillage de chaque valeur de données, latitude et longitude est un taple.
In[]
message.data(lat1=22.45, lat2=22.55, lon1=120.0625, lon2=120.1875)
Out[]
(array([[101985.52856445, 101985.52856445, 101985.52856445],
[101985.52856445, 101985.52856445, 101985.52856445]]),
array([[22.5 , 22.5 , 22.5 ],
[22.45, 22.45, 22.45]]),
array([[120.0625, 120.125 , 120.1875],
[120.0625, 120.125 , 120.1875]]))
Recommended Posts