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

# はじめに

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

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

# データの取得

```Python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091004/cc08622d-ef6b-5895-64ca-a1947e4cff3e.png)

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

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

・項目は、おおよそ下記イメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091004/e48b2bbb-f19a-dae8-17dd-60f758105b7f.png)

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

```Python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091004/610c9848-1d7c-6f37-3da4-01c320255371.png)


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


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091004/695715d6-44f3-35d3-2fac-f8d822c7e61e.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091004/26295d93-f695-24fb-71f8-6a168aafd80b.png)

いい感じですね！✨

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

```Python
# 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3091004/683a5ab5-06b2-9b5f-4526-e5ca52347172.png)

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

# 終わりに

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

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

以　上