Téléchargez les données éoliennes de l'Agence météorologique

Téléchargez les données météorologiques passées de l'Agence météorologique.

Cette fois, c'est le vent. Analyser le HTML en utilisant la belle soupe de Python.

scénario

Tout d'abord, préparez le module.

Préparation


import requests
import bs4
import pandas as pd
import datetime
import time
import numpy as np
from numpy import NaN

Vient ensuite l'assistant de conversion. Si la chaîne de caractères est un nombre, convertissez-la en float. /// est un symbole indiquant qu'il n'y a pas de données d'observation.

assistant


def convert(item_str):
    if not item_str:
        return ''
    if item_str.replace('.','').replace('-','').isdigit():
        return float(item_str)
    if item_str == '///':
        return NaN
    return item_str

Puis le corps principal. Entrez le numéro de préfecture et le numéro de lieu dans l'url. Pour le trouver http://www.data.jma.go.jp/obd/stats/etrn/ Vous pouvez sélectionner l'emplacement dans l'ordre à partir de. Regardez l'URL finale et copiez-la.

Étant donné que la date est indiquée dans la spécification de l'URL et que l'heure est au format hh: mm, convertissez-la avec datetime + timedelta pour la convertir en JST.

Corps


columns = ('JST', 'time', 'Précipitation', 'Température', 'Vitesse moyenne du vent', 'Direction moyenne du vent', 'Vitesse du vent instantanée maximale', 'Vitesse du vent instantanée maximale時風向', 'Heure du soleil')
all_df = []
    
for year in range(2015, 2017): # 2015 ... 2016
    for month in range(1, 13): # 1 ... 12
        for day in range(1, 32): # 1 ... 31

            try:
                this_day = datetime.datetime(year, month, day)
            except ValueError:
                continue # incorrect date; e.g., 2007/2/31 etc.
            print(this_day)

            url = 'http://www.data.jma.go.jp/obd/stats/etrn/view/10min_a1.php? prec_no=44&block_no=47662&year=' + str(year) + '&month=' + str(month) + '&day=' + str(day) + '&view='
            print(url)
            time.sleep(1) # wait for 1 sec
            res = requests.get(url)

            try:
                res.raise_for_status() # check for error
            except Exception as e:
                print('Error: {}'.format(e))
                continue # go to next if error

            res.encoding = 'utf-8'
            soup = bs4.BeautifulSoup(res.text, "lxml")
            tbl = soup.select("#tablefix1 td") # find the table
            n_rows = len(tbl) // 8


            for r in range(n_rows):
                i = 8 * r

                # JST
                hh, mm = tbl[i + 0].getText().split(":") # '00:10' --> '00', '10'
                row_timedelta = datetime.timedelta(hours=int(hh), minutes=int(mm))

                row_time = this_day + row_timedelta # for converting "24:00" to "00:00" of the next day
                row = [row_time]

                # other data
                row.extend([convert(tbl[i + j].getText()) for j in range(8)])

                
                row_df = pd.DataFrame(columns=columns)
                row_df.loc[0] = row
                all_df.append(row_df)


df = pd.concat(all_df, ignore_index=True)        
df.to_excel('wind_data.xlsx')

Recommended Posts

Téléchargez les données éoliennes de l'Agence météorologique
Gratter les données pluviométriques de l'Agence météorologique et les afficher sur M5Stack
Lire le fichier GRIB2 de l'Agence météorologique sur pygrib
Gestion des erreurs après l'arrêt du téléchargement des données apprises de VGG16
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
Convertir le GRIB des données de coordonnées polaires de radar météorologique à double polarisation en netCDF (norme CF / Radial)
L'histoire de la lecture des données HSPICE en Python
Utilisation des données météorologiques passées 1 (affichage des points Amedas)
[Petite histoire] Téléchargez l'image de Ghibli immédiatement
Transition du baseball vue à partir des données
Vérifiez l'état des données à l'aide de pandas_profiling
Gratter les données gagnantes de Numbers à l'aide de Docker
Une histoire sur l'obtention du champ Atom (télégramme XML) de l'Agence météorologique avec une tarte à la râpe et de le tweeter
À propos de l'inefficacité du transfert de données dans luigi on-memory
Ne pas être conscient du contenu des données en python
J'ai essayé d'utiliser l'API de Sakenowa Data Project
Utilisons les données ouvertes de "Mamebus" en Python
Comprendre l'état de la perte de données - Python vs R
#Nous automatiserons l'agrégation des données de Wiire! partie 1
Convertir le GRIB des coordonnées per-polaires du radar de l'Agence météorologique GPV en netCDF (norme CF / Radial)