[PYTHON] Verwendung früherer meteorologischer Daten 3 (Zeitreihen-Wärmekartenanzeige des Niederschlags bei starkem Regen)

Die Meteorologische Agentur wird historische Wetterdaten bis Ende März 2020 kostenlos zur Verfügung stellen. (Referenz) Nutzungsumgebung vergangener Wetterdaten https://www.data.jma.go.jp/developer/past_data/index.html

Die grundlegenden Wetterdaten lauten "Jeder kann sie unabhängig von Zweck und Verwendungszweck verwenden", daher werden wir anhand der Wetterdaten etwas unternehmen.

Sie können es auch von der Seite "Past Meteorological Data Download" der Meteorological Agency herunterladen. Dies ist jedoch sehr praktisch, da Sie alles auf einmal herunterladen können. Die verfügbaren Daten sind unten aufgeführt. https://www.data.jma.go.jp/developer/past_data/data_list_20200114.pdf Die Frist kommt bald. Wenn Sie sie benötigen, laden Sie sie frühzeitig herunter.

Lassen Sie uns diesmal den Übergang des Niederschlags während einer Katastrophe auf einer Karte mit einer Wärmekarte anzeigen. Wir haben letztes Jahr den Taifun Nr. 19 angenommen, aber da er nur bis Juli 2019 veröffentlicht wurde, werden wir die Daten für den starken Regen im Juli 2018 verwenden. Ich habe Folium (0.10.1) zum Zeichnen der Karte verwendet.

Daten herunterladen

Verwenden Sie "Regionale meteorologische Beobachtung (Amedas)" - "Stunden- / Tageswert", um den stündlichen Niederschlag an jedem Amedas-Punkt zu erhalten. Diese Datei enthält Beobachtungsinformationen wie Niederschlag und Temperatur an jedem Amedas-Standort. Überprüfen Sie Folgendes für das Dateiformat. http://data.wxbc.jp/basic_data/kansoku/amedas/format_amedas.pdf

Laden Sie die Datei in den Ordner amedas herunter. Es braucht Zeit, weil es eine Kapazität von ca. 2 GB hat.

import os
import urllib.request

#Download der stündlichen / täglichen Wertwetterbeobachtungsdatei
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'
#Ordner erstellen
os.makedirs(folder, exist_ok=True)
if not os.path.exists(path):
    #herunterladen
    urllib.request.urlretrieve(url, path)

Da die Datei im Tar-Format vorliegt, überprüfen Sie den Inhalt der Datei.

#Dateibestätigung
import tarfile

#Überprüfen Sie die in der TAR-Datei enthaltenen Dateien
with tarfile.open(path, 'r') as tf:
    for tarinfo in tf:
        print(tarinfo.name)

Der Inhalt war tar.gz-Dateien wie hourly_daily_1976.tar.gz. Es wird jedes Jahr zu tar.gz gehärtet. Weitere Erweiterungen sind erforderlich. Lassen Sie uns den Inhalt der Datei tar.gz überprüfen.

#Dateibestätigung 2
import tarfile

#Überprüfen Sie die in der TAR-Datei enthaltenen Dateien
with tarfile.open(path, 'r') as tf:
    for tarinfo in tf:
        print(tarinfo.name)
        if tarinfo.isfile():
            # tar.Überprüfen Sie die in der gz-Datei enthaltenen Dateien
            with tarfile.open(fileobj=tf.extractfile(tarinfo), mode='r') as tf2:
                for tarinfo2 in tf2:
                    if tarinfo2.isfile():
                        print('\t' + tarinfo2.name)

Sie können sehen, dass die folgenden Dateien vorhanden sind. hourly_daily_1976/area57/ahd1976.57246 Der Dateiname hat das folgende Format. ahdYYYY.SSSSS (JJJJ: Jahr des Jahres, SSS: Stationsnummer)

Niederschlagsdaten lesen

Wir werden die Niederschlagsmenge an den Amedas-Punkten vom 5. bis 8. Juli 2018 landesweit erfassen. Lesen Sie die TAR-Datei und tar.gz, ohne sie zu erweitern. Jede Datei hat einen Tag Wert von 1300 Byte. Ich werde es bis zum 4. Juli überspringen. Schließen Sie Punkte aus, an denen nur Schneefall gemessen wird. Außerdem werden andere Daten als der Normalwert (RMK ist 8) als fehlend behandelt.

Bereiten Sie einen Pandas-Datenrahmen zum Speichern von Daten vor. Speichert Daten mit Datum und Uhrzeit als Zeilen und der Stationsnummer als Spalten.

#Erstellen eines Datenrahmens für die Datenspeicherung
import pandas as pd

prec_df = pd.DataFrame()
#Niederschlagsdatenerfassung
import tarfile
import struct

#5. bis 8. Juli 2018
year = '2018'
month = 7
start_date = 5
end_date   = 8
head_size = 28
time_size = 48
day_size  = 120
r_size = 1300

#Holen Sie sich die in der TAR-Datei enthaltenen Dateien
with tarfile.open(path, 'r') as tf:
    for tarinfo in tf:
        if tarinfo.isfile():
            #Dateien für 2018 extrahieren
            if tarinfo.name[13:17] == year:
                # tar.Holen Sie sich die in der gz-Datei enthaltenen Dateien
                with tarfile.open(fileobj=tf.extractfile(tarinfo), mode='r') as tf2:
                    for tarinfo2 in tf2:
                        if tarinfo2.isfile():
                            print(tarinfo2.name)
                            #Datei öffnen
                            with tf2.extractfile(tarinfo2) as tf3:
                                #Bis heute überspringen
                                buff = tf3.read((month-1)*31*r_size)
                                buff = tf3.read((start_date-1)*r_size)
                                #Nach Datum lesen
                                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)
                                    #Observatorium mit nur Schneefall ist nicht anwendbar
                                    if sta_type != 0:
                                        for time in range(24):
                                            buff = tf3.read(time_size)
                                            prec, rmk = struct.unpack('<hh44x', buff)
                                            #Fehlende Bestätigung
                                            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:
                                        #Überspringen Sie den Rest der Daten
                                        buff = tf3.read(r_size-head_size)

Es wird einige Zeit dauern, aber ich konnte die Niederschlagsdaten abrufen. Lassen Sie uns die Daten überprüfen.

prec_df

Überprüfen Sie die Anzahl der Fehler als Referenz.

prec_df.isnull().values.sum()

Es gab 492 Mängel.

Ermitteln des Breiten- und Längengrads des Observatoriums

Amedas Punktinformationsdatei herunterladen

Laden Sie die Amedas-Standortinformationsdatei herunter.

import os
import urllib.request

#Amedas Punktinformationsdatei herunterladen
url    = 'http://data.wxbc.jp/basic_data/kansoku/amedas/amdmaster_201909.tar.gz'
folder = 'amedas'
path   = 'amedas/amdmaster_201909.tar.gz'
#Ordner erstellen
os.makedirs(folder, exist_ok=True)
if not os.path.exists(path):
    #herunterladen
    urllib.request.urlretrieve(url, path)

Überprüfen Sie die Datei.

#Dateibestätigung
import tarfile

#Überprüfen Sie die in der TAR-Datei enthaltenen Dateien
with tarfile.open(path, 'r') as tf:
    for tarinfo in tf:
        print(tarinfo.name)

Lesen des Breiten- und Längengrads des Observatoriums

Die Historie der Beobachtungspunkte wird in amdmaster.index gespeichert. Seit dem Verlauf jedes Punktes können Sie den Breiten- und Längengrad des Beobachtungsdatums abrufen. Auf dem Display werden jedoch der letzte Breiten- und Längengrad als Breiten- und Längengrad des Beobachtungspunkts verwendet, da die Bewegung des Beobachtungspunkts innerhalb des Fehlerbereichs liegt. In einem Pandas-Datenrahmen speichern.

#Erstellen eines Datenrahmens zum Speichern von Amedas Punktinformationen
import pandas as pd

amedas_df = pd.DataFrame()
#Ermitteln des Breiten- und Längengrads des Observatoriums
with tarfile.open(path, 'r') as tf:
    for tarinfo in tf:
        if tarinfo.name == 'amdmaster_201909/amdmaster.index':
            #Datei öffnen
            with tf.extractfile(tarinfo) as tf2:
                #Header überspringen
                line = tf2.readline()
                line = tf2.readline()
                line = tf2.readline()
                while line:
                    #Holen Sie sich die neuesten Breiten- und Längengrade
                    prec_no = int(line[0:5])
                    amedas_df.loc[prec_no, 'Name des Observatoriums'] = line[6:26].decode('shift_jis').replace(" ", "")
                    amedas_df.loc[prec_no, 'Breite'] = int(line[74:76]) + float(line[77:81])/60
                    amedas_df.loc[prec_no, 'Längengrad'] = int(line[82:85]) + float(line[86:90])/60
                    line = tf2.readline()
            break

Anzeige der Längen- und Breitengrade des Observatoriums

amedas_df

Datenerstellung für die Heatmap-Anzeige

Erstellen Sie für jeden Punkt eine Liste mit [Breite, Länge, Gewicht] und fügen Sie diese hinzu. Geben Sie als Gewicht die Niederschlagsmenge an. Wir müssen jedoch einen Wert von 0 <Gewicht <= 1 angeben, damit wir den Niederschlag durch 100 teilen. Wenn die Niederschlagsmenge 100 mm oder mehr beträgt, wird sie mit 100 mm berechnet. Wenn der Niederschlag 0 ist oder fehlt, wird er nicht in den Punkt aufgenommen. Liste [Breite, Länge, Niederschlag] nach Stunde. Es wird eine dreidimensionale Liste sein, wie unten gezeigt. [[[Breite, Länge, Niederschlag]]] Der Index speichert Datum und Uhrzeit für die Zeitreihenanzeige.

import numpy as np

#Generieren Sie stündlich Breiten-, Längen- und Niederschlagsdaten für jeden Punkt
data = []
index = []
for time in prec_df.index:
    point = []
    index.append(time)
    for sta_no in prec_df.columns:
        #print(sta_no, time)
        #Gilt nicht für den Fall eines Defekts
        if np.isnan(prec_df.loc[time, sta_no]): continue
        #Ohne Niederschlag nicht anwendbar
        if prec_df.loc[time, sta_no] == 0: continue
        #Holen Sie sich Breite und Länge
        latitude =  None
        longitude = None
        day = time[0:8]
        latitude = amedas_df.loc[int(sta_no), 'Breite']
        longitude = amedas_df.loc[int(sta_no), 'Längengrad']
        #Stellen Sie den Niederschlag auf 1 ein, um für die Wärmekarte zwischen 0 und 1 zu liegen./100 Wenn es 100 mm oder mehr beträgt, muss es 100 mm betragen.
        prec = min(prec_df.loc[time, sta_no], 100) / 100
        point.append([latitude, longitude, float(prec)])
    data.append(point)

Überprüfen Sie die Daten.

data

Zeitreihen-Heatmap-Anzeige

Verwenden Sie Folium, um eine Zeitreihen-Wärmekarte anzuzeigen. Verwenden Sie die HeatMapWithTime-Funktion. Die Parameter finden Sie im Folgenden. https://python-visualization.github.io/folium/plugins.html Die Farbe ändert sich je nach Niederschlagsmenge in Blau, Kalk, Gelb, Orange und Rot.

Der Mittelpunkt ist Hiroshima.

import folium
from folium import plugins

#Amedas Punkt auf der Karte anzeigen
#Mittelpunkteinstellung
sta_no = 67437 #Hiroshima
latitude = amedas_df.loc[int(sta_no), 'Breite']
longitude = amedas_df.loc[int(sta_no), 'Längengrad']
map = folium.Map(location=[latitude, longitude], zoom_start=7)

#Heatmap-Anzeige
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

Die Niederschlagsdaten werden wie unten gezeigt als Wärmekarte auf der Karte angezeigt. Die Anzeige wechselt stündlich.

heatmap.png

Auf der Wärmekartenanzeige von Folium sieht der Datenwert groß aus, wenn die Beobachtungspunkte nahe sind. Da es auf dem Amedas-Punkt basiert, ist es nicht so genau wie das Regenwolkenradar, aber Sie können die groben Änderungen sehen. Es ist möglicherweise einfacher zu verstehen, wenn die Geschwindigkeit auf 10 fps erhöht wird.

Sie können es auch in HTML speichern und anzeigen.

#Karte speichern
map.save(outfile="prec20180705_08_map.html")

Ich habe versucht, die Niederschlagsmenge bei starkem Regen auf einer Zeitreihen-Wärmekarte anzuzeigen.

Die Daten werden bis Ende März 2020 veröffentlicht. Wenn Sie sie benötigen, empfehlen wir Ihnen, sie so bald wie möglich herunterzuladen.

Recommended Posts

Verwendung früherer meteorologischer Daten 3 (Zeitreihen-Wärmekartenanzeige des Niederschlags bei starkem Regen)
Verwendung vergangener Wetterdaten 1 (Amedas Punktanzeige)
Verwendung vergangener Wetterdaten 1 (Amedas Punktanzeige)
Verwendung früherer meteorologischer Daten 3 (Zeitreihen-Wärmekartenanzeige des Niederschlags bei starkem Regen)
Verwenden wir die offenen Daten von "Mamebus" in Python
Versuchen Sie, COVID-19 Tokyo-Daten mit Python zu kratzen
Datenanalyse basierend auf den Wahlergebnissen der Gouverneurswahl von Tokio (2020)
Verwenden Sie PyCaret, um den Preis von Gebrauchtwohnungen in Tokio vorherzusagen!
Erläutern Sie den Mechanismus der PEP557-Datenklasse
Holen Sie sich die Spaltenliste und Datenliste von CASTable
Visualisieren Sie die Exportdaten des Piyo-Protokolls
[Django] Google-Kartenanzeige von GIS-Daten und grafische Darstellung von Parametern