4
8

Python 気象庁API 全国気象実績の取得(アメダス)

Posted at

はじめに

気象庁API(非公式) を使って、日本全国の気象実績を取得するコードを紹介します。
いわゆるアメダスのデータです!

前提条件

・データは気象庁HPに公開されているものと同じですが、非公式なため用途に注意。
・APIでは、過去10日分しか取得できません。
・現在時刻の実績が10分単位で公開されています。
・全国の観測所のデータがまとめて取得できます。
・観測所は、観測所名・緯度・経度・観測所IDを別途取得可能です。

データの取得

import requests
import pandas as pd

# JSONデータのURL
url = "https://www.jma.go.jp/bosai/amedas/data/map/20240515160000.json"

# APIからデータを取得
response = requests.get(url)
data = response.json()

# Pandasデータフレームに変換
df = pd.DataFrame.from_dict(data, orient='index')

# データフレームの表示
df.head()

・requestsを使って、API-URLにアクセスし、jsonデータを取得
・Pandasデータフレームに変換しています。

image.png

こんなデータが取得できます!

解説

・20240515160000.json の部分は、2024-05-15-16-00-00 = YYYY-MM-DD-HH-MM-SSの形式です。
⇒2024年05月15日16:00時台の気象データが入っています。

・項目は、おおよそ下記イメージです。
image.png

期間を指定した データ取得

import requests
import pandas as pd
from datetime import datetime, timedelta
import time

def fetch_amedas_data(start_date, end_date):
    """
    指定した期間のデータを取得し、Pandasデータフレームに整理する関数。
    
    :param start_date: 開始日('YYYYMMDD'形式)
    :param end_date: 終了日('YYYYMMDD'形式)
    :return: 期間内のデータを含むデータフレーム
    """
    base_url = "https://www.jma.go.jp/bosai/amedas/data/map/"
    all_data = []

    start_datetime = datetime.strptime(start_date, "%Y%m%d")
    end_datetime = datetime.strptime(end_date, "%Y%m%d")

    current_datetime = start_datetime

    while current_datetime <= end_datetime:
        for hour in range(24):
            timestamp = current_datetime.strftime(f"%Y%m%d{hour:02d}0000")
            url = f"{base_url}{timestamp}.json"
            response = requests.get(url)

            if response.status_code == 200:
                data = response.json()
                df = pd.DataFrame.from_dict(data, orient='index')
                
                # 日付と時刻の列を追加
                df['日付'] = current_datetime.strftime('%Y-%m-%d')
                df['時刻'] = f"{hour:02d}:00:00"
                
                all_data.append(df)

            # APIへの負荷を軽減するためにスリープ
            time.sleep(0.05)
        
        current_datetime += timedelta(days=1)

    # すべてのデータフレームを結合
    final_df = pd.concat(all_data)
    return final_df

# 使用例
start_date = "20240506"
end_date = "20240515"
# データがない日は、自然にスルーされる。

df = fetch_amedas_data(start_date, end_date)

df["観測地点ID"] = df.index.values

# データフレームの表示
df.head()

# CSVファイルとして保存
df.to_csv('./output/amedas_data_jp_' + start_date + 'to' + end_date + '.csv', encoding='cp932', index=False)

こんな感じで、データ取得ができます💡

image.png

名古屋だけ取り出すとこんな感じですねー!
2024/05/06の9時~13時までの実績です。

image.png

補足

実際に活用しようとしたとき、このままだと各値はlist形式になっており、扱いにくい状態です。
下記処理を実行することで、数字データとなります💡

# 各列のリストの1番目の要素を取り出して新しいデータフレームを作成
df_single_element = nag.applymap(lambda x: x[0] if isinstance(x, list) else x)

image.png

いい感じですね!✨

観測所情報の取得

ここまでのデータは、日本のどの地点の情報か?がわからないので、別途取得しましょう。

# JSONデータのURL
url = "https://www.jma.go.jp/bosai/amedas/const/amedastable.json"

# APIからデータを取得
response = requests.get(url)
data = response.json()

# Pandasデータフレームに変換
df2 = pd.DataFrame.from_dict(data, orient='index')

image.png

観測所名・緯度・経度・観測所IDを取得できました!
あとは、IDで紐づけすればOKですね💡

終わりに

アメダスの気象情報をPythonで取得する方法をまとめました。
スクレイピングせずに取得できるのは、非常にありがたいですね・・・✨

ちなみに10日以上前の実績は、気象庁のCSVダウンロード機能で取得するほかありません・・・!

以 上

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8