はじめに
気象庁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データフレームに変換しています。
こんなデータが取得できます!
解説
・20240515160000.json の部分は、2024-05-15-16-00-00 = YYYY-MM-DD-HH-MM-SSの形式です。
⇒2024年05月15日16:00時台の気象データが入っています。
期間を指定した データ取得
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)
こんな感じで、データ取得ができます💡
名古屋だけ取り出すとこんな感じですねー!
2024/05/06の9時~13時までの実績です。
補足
実際に活用しようとしたとき、このままだと各値はlist形式になっており、扱いにくい状態です。
下記処理を実行することで、数字データとなります💡
# 各列のリストの1番目の要素を取り出して新しいデータフレームを作成
df_single_element = nag.applymap(lambda x: x[0] if isinstance(x, list) else x)
いい感じですね!✨
観測所情報の取得
ここまでのデータは、日本のどの地点の情報か?がわからないので、別途取得しましょう。
# 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')
観測所名・緯度・経度・観測所IDを取得できました!
あとは、IDで紐づけすればOKですね💡
終わりに
アメダスの気象情報をPythonで取得する方法をまとめました。
スクレイピングせずに取得できるのは、非常にありがたいですね・・・✨
ちなみに10日以上前の実績は、気象庁のCSVダウンロード機能で取得するほかありません・・・!
以 上