[PYTHON] Utilisation des données météorologiques passées 3 (affichage de cartes thermiques chronologiques des précipitations lors de fortes pluies)

L'Agence météorologique fournira gratuitement des données météorologiques historiques jusqu'à fin mars 2020. (Référence) Environnement d'utilisation des données météorologiques passées https://www.data.jma.go.jp/developer/past_data/index.html

Les données météorologiques de base sont "Tout le monde peut l'utiliser quel que soit le but et la cible d'utilisation", nous allons donc faire quelque chose en utilisant les données météorologiques.

Vous pouvez également le télécharger à partir de la page "Téléchargement des données météorologiques passées" de l'Agence météorologique, mais c'est très pratique car vous pouvez tout télécharger en même temps. Les données disponibles sont énumérées ci-dessous. https://www.data.jma.go.jp/developer/past_data/data_list_20200114.pdf La date limite arrive bientôt, donc si vous en avez besoin, téléchargez-la tôt.

Cette fois, affichons la transition des précipitations lors d'une catastrophe sur une carte avec une carte thermique. Nous avons supposé le typhon n ° 19 l'année dernière, mais comme il n'a été libéré que jusqu'en juillet 2019, nous utiliserons les données pour les fortes pluies de juillet 2018. J'ai utilisé du folium (0.10.1) pour dessiner la carte.

Téléchargement de données

Utilisez «Observation météorologique régionale (Amedas)» - «Valeur horaire / quotidienne» pour obtenir les précipitations horaires à chaque point d'Amédas. Ce fichier contient des informations d'observation telles que les précipitations et la température sur chaque site Amedas. Vérifiez les éléments suivants pour le format de fichier. http://data.wxbc.jp/basic_data/kansoku/amedas/format_amedas.pdf

Téléchargez le fichier dans le dossier amedas. Cela prend du temps car il a une capacité d'environ 2 Go.

import os
import urllib.request

#Téléchargement du fichier de valeur horaire / quotidienne d'observation météorologique au sol
url    = 'http://data.wxbc.jp/basic_data/kansoku/amedas/hourly_daily_1976-2019_v191121.tar'
folder = 'amedas'
path   = 'amedas/hourly_daily_1976-2019_v191121.tar'
#Créer le dossier
os.makedirs(folder, exist_ok=True)
if not os.path.exists(path):
    #Télécharger
    urllib.request.urlretrieve(url, path)

Le fichier étant au format tar, vérifiez le contenu du fichier.

#Confirmation de fichier
import tarfile

#Vérifier les fichiers inclus dans le fichier tar
with tarfile.open(path, 'r') as tf:
    for tarinfo in tf:
        print(tarinfo.name)

Le contenu était des fichiers tar.gz tels que hourly_daily_1976.tar.gz. Il est durci en tar.gz chaque année. Une expansion supplémentaire est nécessaire. Vérifions le contenu du fichier tar.gz.

#Confirmation de fichier 2
import tarfile

#Vérifier les fichiers inclus dans le fichier tar
with tarfile.open(path, 'r') as tf:
    for tarinfo in tf:
        print(tarinfo.name)
        if tarinfo.isfile():
            # tar.Vérifiez les fichiers inclus dans le fichier gz
            with tarfile.open(fileobj=tf.extractfile(tarinfo), mode='r') as tf2:
                for tarinfo2 in tf2:
                    if tarinfo2.isfile():
                        print('\t' + tarinfo2.name)

Vous pouvez voir que les fichiers suivants existent. hourly_daily_1976/area57/ahd1976.57246 Le nom du fichier est au format suivant. ahdYYYY.SSSSS (YYYY: année de l'année, SSS: numéro de station)

Lecture des données de précipitations

Nous allons acquérir la quantité de précipitations aux points Amedas dans tout le pays du 5 au 8 juillet 2018. Lire sans extraire le fichier tar et tar.gz. La valeur d'une journée de chaque fichier est de 1300 octets. Je vais le sauter jusqu'au 4 juillet. Excluez les points où seules les chutes de neige sont mesurées. En outre, les données autres que la valeur normale (RMK est 8) sont traitées comme manquantes.

Préparez une trame de données pandas pour stocker des données. Stocke les données avec la date et l'heure sous forme de lignes et le numéro de station sous forme de colonnes.

#Création d'une trame de données pour le stockage de données
import pandas as pd

prec_df = pd.DataFrame()
#Acquisition des données de précipitations
import tarfile
import struct

#5-8 juillet 2018
year = '2018'
month = 7
start_date = 5
end_date   = 8
head_size = 28
time_size = 48
day_size  = 120
r_size = 1300

#Récupérez les fichiers contenus dans le fichier tar
with tarfile.open(path, 'r') as tf:
    for tarinfo in tf:
        if tarinfo.isfile():
            #Extraire les fichiers pour 2018
            if tarinfo.name[13:17] == year:
                # tar.Récupérez les fichiers contenus dans le fichier gz
                with tarfile.open(fileobj=tf.extractfile(tarinfo), mode='r') as tf2:
                    for tarinfo2 in tf2:
                        if tarinfo2.isfile():
                            print(tarinfo2.name)
                            #Fichier ouvert
                            with tf2.extractfile(tarinfo2) as tf3:
                                #Passer à la date
                                buff = tf3.read((month-1)*31*r_size)
                                buff = tf3.read((start_date-1)*r_size)
                                #Lire par date
                                for i in range(start_date, end_date+1):
                                    buff = tf3.read(head_size)
                                    sta_no, sta_type, year, monte, date = struct.unpack('<ih16xhhh', buff)
                                    print(sta_no, sta_type, year, month, date)
                                    #L'observatoire avec seulement des chutes de neige n'est pas applicable
                                    if sta_type != 0:
                                        for time in range(24):
                                            buff = tf3.read(time_size)
                                            prec, rmk = struct.unpack('<hh44x', buff)
                                            #Confirmation manquante
                                            if rmk != 8:
                                                prec_df.loc['{:04}{:02}{:02}{:02}'.format(year, monte, date, time), str(sta_no)] = None
                                            else:
                                                prec_df.loc['{:04}{:02}{:02}{:02}'.format(year, monte, date, time), str(sta_no)] = prec * 0.1
                                        buff = tf3.read(day_size)
                                    else:
                                        #Passer le reste des données
                                        buff = tf3.read(r_size-head_size)

Cela prendra du temps, mais j'ai pu obtenir les données sur les précipitations. Vérifions les données.

prec_df

Vérifiez le nombre de défauts pour référence.

prec_df.isnull().values.sum()

Il y avait 492 défauts.

Obtention de la latitude et de la longitude de l'observatoire

Téléchargement du fichier d'information sur les points Amedas

Téléchargez le fichier d'informations de localisation Amedas.

import os
import urllib.request

#Téléchargement du fichier d'information sur les points Amedas
url    = 'http://data.wxbc.jp/basic_data/kansoku/amedas/amdmaster_201909.tar.gz'
folder = 'amedas'
path   = 'amedas/amdmaster_201909.tar.gz'
#Créer le dossier
os.makedirs(folder, exist_ok=True)
if not os.path.exists(path):
    #Télécharger
    urllib.request.urlretrieve(url, path)

Vérifiez le fichier.

#Confirmation de fichier
import tarfile

#Vérifier les fichiers inclus dans le fichier tar
with tarfile.open(path, 'r') as tf:
    for tarinfo in tf:
        print(tarinfo.name)

Lecture de la latitude et de la longitude de l'observatoire

L'historique des points d'observation est stocké dans amdmaster.index. Depuis l'historique de chaque point, vous pouvez obtenir la latitude et la longitude de la date d'observation, mais sur l'affichage, la dernière latitude et longitude sont utilisées comme latitude et longitude du point d'observation car le mouvement du point d'observation est dans la plage d'erreur. Stocker dans une trame de données pandas.

#Création d'un bloc de données pour stocker les informations de point Amedas
import pandas as pd

amedas_df = pd.DataFrame()
#Obtention de la latitude et de la longitude de l'observatoire
with tarfile.open(path, 'r') as tf:
    for tarinfo in tf:
        if tarinfo.name == 'amdmaster_201909/amdmaster.index':
            #Fichier ouvert
            with tf.extractfile(tarinfo) as tf2:
                #Ignorer l'en-tête
                line = tf2.readline()
                line = tf2.readline()
                line = tf2.readline()
                while line:
                    #Obtenez la dernière latitude et longitude
                    prec_no = int(line[0:5])
                    amedas_df.loc[prec_no, 'Nom de l'observatoire'] = line[6:26].decode('shift_jis').replace(" ", "")
                    amedas_df.loc[prec_no, 'latitude'] = int(line[74:76]) + float(line[77:81])/60
                    amedas_df.loc[prec_no, 'longitude'] = int(line[82:85]) + float(line[86:90])/60
                    line = tf2.readline()
            break

Affichage de la latitude et de la longitude de l'observatoire

amedas_df

Création de données pour l'affichage de la carte thermique

Créez et ajoutez une liste de [latitude, longitude, poids] pour chaque point. Pour le poids, spécifiez la quantité de précipitations. Cependant, nous devons spécifier une valeur de 0 <poids <= 1, nous allons donc diviser les précipitations par 100. Si la quantité de précipitations est de 100 mm ou plus, elle est calculée comme 100 mm. De plus, si la précipitation est nulle ou manquante, elle ne sera pas incluse dans le point. Liste [Latitude, longitude, précipitations] par heure. Ce sera une liste en trois dimensions comme indiqué ci-dessous. [[[Latitude, longitude, précipitations]]] L'index stocke la date et l'heure pour l'affichage des séries chronologiques.

import numpy as np

#Générer des données de latitude, de longitude et de précipitations pour chaque point sur une base horaire
data = []
index = []
for time in prec_df.index:
    point = []
    index.append(time)
    for sta_no in prec_df.columns:
        #print(sta_no, time)
        #Non applicable en cas de défaut
        if np.isnan(prec_df.loc[time, sta_no]): continue
        #Non applicable sans précipitations
        if prec_df.loc[time, sta_no] == 0: continue
        #Obtenez la latitude et la longitude
        latitude =  None
        longitude = None
        day = time[0:8]
        latitude = amedas_df.loc[int(sta_no), 'latitude']
        longitude = amedas_df.loc[int(sta_no), 'longitude']
        #Réglez les précipitations sur 1 pour aller de 0 à 1 pour la carte de chaleur./100 S'il est de 100 mm ou plus, il doit être de 100 mm.
        prec = min(prec_df.loc[time, sta_no], 100) / 100
        point.append([latitude, longitude, float(prec)])
    data.append(point)

Vérifiez les données.

data

Affichage de la carte thermique des séries chronologiques

Utilisez folium pour afficher une carte thermique chronologique. Utilisez la fonction HeatMapWithTime. Reportez-vous à ce qui suit pour les paramètres. https://python-visualization.github.io/folium/plugins.html La couleur change en bleu, citron vert, jaune, orange et rouge, en fonction de la quantité de précipitations.

Le point central est Hiroshima.

import folium
from folium import plugins

#Afficher le point Amedas sur la carte
#Réglage du point central
sta_no = 67437 #Hiroshima
latitude = amedas_df.loc[int(sta_no), 'latitude']
longitude = amedas_df.loc[int(sta_no), 'longitude']
map = folium.Map(location=[latitude, longitude], zoom_start=7)

#Affichage de la carte thermique
hm = plugins.HeatMapWithTime(data, index, radius=100, min_opacity=0, max_opacity=1, auto_play=True,
                             gradient={0.1: 'blue', 0.25: 'lime', 0.5:'yellow', 0.75:'orange',1.0: 'red'})
hm.add_to(map)
map

Les données de pluie sont affichées sous forme de carte de chaleur sur la carte comme indiqué ci-dessous. L'affichage change toutes les heures.

heatmap.png

Sur l'affichage de la carte thermique du folium, la valeur des données semble grande lorsque les points d'observation sont proches. Comme il est basé sur le point Amedas, il n'est pas aussi précis que le radar des nuages de pluie, mais vous pouvez voir les changements approximatifs. Il peut être plus facile de comprendre si la vitesse est augmentée à 10 ips.

Vous pouvez également l'enregistrer au format html et l'afficher.

#Enregistrer la carte
map.save(outfile="prec20180705_08_map.html")

J'ai essayé d'afficher la quantité de précipitations lors de fortes pluies sur une carte thermique chronologique.

Les données seront publiées jusqu'à la fin du mois de mars 2020, donc si vous en avez besoin, nous vous recommandons de les télécharger dès que possible.

Recommended Posts

Utilisation des données météorologiques passées 3 (affichage de cartes thermiques chronologiques des précipitations lors de fortes pluies)
Utilisation des données météorologiques passées 1 (affichage des points Amedas)
Utilisation des données météorologiques passées 1 (affichage des points Amedas)
Utilisation des données météorologiques passées 3 (affichage de cartes thermiques chronologiques des précipitations lors de fortes pluies)
Utilisons les données ouvertes de "Mamebus" en Python
Essayez de gratter les données COVID-19 Tokyo avec Python
Analyse des données basée sur les résultats des élections du gouverneur de Tokyo (2020)
Utilisez PyCaret pour prédire le prix des appartements d'occasion à Tokyo!
Expliquer le mécanisme de la classe de données PEP557
Obtenez la liste des colonnes et la liste des données de CASTable
Visualisez les données d'exportation du journal Piyo
[Django] Affichage de la carte Google des données SIG et représentation graphique des paramètres