【Python】気象庁のデータから47都道府県庁所在地の雨温図を生成してみる

# 背景

ふとしたきっかけで急に日本全国の雨温図を自作してみたくなったので、Pythonを使って各県庁所在地の雨温図を作ってみました。

# 作ったもの

今回は、以下のようなExcelファイルと雨温図を作ります。

- Excelファイル

![生成したExcelファイル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1125965/32ee6c23-992d-8a01-9229-57f0e73abbb7.jpeg "Excelファイル")

- 雨温図

![雨温図_札幌](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1125965/8472e519-9549-7e05-8d71-fed211660ea3.png "札幌の雨温図")


# 環境

- Windows 10
- Python 3.9.1
- pandas 1.24
- matplotlib 3.4.1
- numpy 1.19.3

# 作成手順

## データの取得

https://www.data.jma.go.jp/gmd/risk/obsdl/

気象庁が過去の気象データを公開しているので、そこから気象データをダウンロードします。
今回は、以下の検索条件を指定しました。

- 地点
    - 各都道府県の県庁所在地

- 項目
    - 月平均気温
    - 降水量の月合計
    - 「過去の平均値との比較オプション」の**「平均値も表示」**

- 期間
    - 連続した期間で表示（2020年1月 ~ 2020年12月）   
    （指定する年度は任意）

- 表示オプション
    - 利用上注意が必要なデータの扱い<br>→ **値を表示(格納)しない。**
    - 観測環境などの変化の前後で、値が不均質となったデータの扱い<br>→**観測環境などの変化前の値を表示(格納)しない。**
    - ダウンロードCSVファイルのデータ仕様<br>→**データ表示画面と同様に、数値以外の記号を含む**

:::note warn
表示オプションは設定しなくても構いませんが、設定しておくと後のデータの整理が楽になります。
:::

## 気象データの整理

### csvの読み込み

```python
import pandas as pd

df = pd.read_csv("ダウンロードしたcsvファイルのパス", header = 1, index_col = 0,  encoding="cp932")
```

そのまま読み込むと文字化けしてしまったので、この記事[^1]を参考に`encoding="cp932"`を指定しました。

### 必要な部分の抽出

```python
length = len(df.columns)
df = df.iloc[:, 1:length:2] # 1行飛ばしで抽出
df = df[2:14]
```

今回作成する雨温図には各項目の過去の平均値を用いることにします。
過去の平均値は1列飛ばしとなっているので、`[:, 1:length:2]`として抽出しています。
また、上から2行の情報はいらないので必要な行のみを抽出します。

### 型の変換

```python
df = df.astype("float")
```

最初に格納されている数値のデータ型は`str`型です。このままだとこの後うまくグラフを作ることができないのでデータ型を`float`に変換しておきます。

### Excelファイルへの書き出し

```python
it = iter(df.columns.tolist())

with pd.ExcelWriter("weathers.xlsx") as writer:
    for i, j in zip(it, it):
        sheet_name = i.replace(".1", "")
        df_new = df[[i, j]]
        df_new.columns = ["平均気温", "降水量"]
        df_new.index = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]
        df_new.to_excel(writer, index=True, sheet_name=sheet_name)
```

各県庁所在地の「平均気温」と「降水量」を、それぞれ個別に各県庁所在地名のシートにしてExcelファイルに出力しています。
データフレームから連続する二つの列を抽出する方法については、この記事[^2]を参考にしました。
各県庁所在地名は取得した最初の列名から`.1`を取り除くことにより取得しています。
また、後からわかりやすいようにに列名と行名を変更しています。

## 雨温図の作成

### Excelファイルの読み取り

```python
dfs = pd.read_excel("weathers.xlsx", sheet_name=None)
```

先ほど作成したExcelファイルを読み込みます。
複数シートの読み込みについてはこの記事[^3]を参考にしました。
このとき`dfs`は、シート名（ここでは「県庁所在地」）がキー`key`、シートのデータ（ここでは「平均気温」と「降水量」）が値`value`となる辞書`dict`となっています。

### 雨温図の作成

```python
import matplotlib.pyplot as plt
import japanize_matplotlib
import numpy as np

city_code = 1

for item in dfs.items():
    city_name = item[0]
    df = item[1]
    df = df.rename(columns={"Unnamed: 0": "月"})

    # 各グラフの色を指定
    color_temperature = "orangered"
    color_waterfall = "deepskyblue"

    # グラフ描画領域を作成
    fig,ax1=plt.subplots(figsize=(5,8))
    ax2=plt.twinx(ax1)

    # グラフを描画
    plt.title(city_name)
    ax1.plot(df["月"], df["平均気温"], zorder=100, color=color_temperature, label="平均気温", alpha= 1)
    ax2.bar(df["月"], df["降水量"], zorder=1, color=color_waterfall, label="降水量", edgecolor='#333', linewidth=1, alpha = 0.5, width=1)

    ax1.set_ylabel("気温(℃)")
    ax2.set_ylabel("降水量(mm)")


    ax1.set_yticks(np.array(range(-10, 41, 10)))
    ax2.set_yticks(np.array(range(0, 501, 100)))

    ax1.grid(which = "major", axis = "y", color = "gray", alpha = 0.5, linewidth = 1)
    ax1.set_axisbelow(True)

    handler1, label1 = ax1.get_legend_handles_labels()
    handler2, label2 = ax2.get_legend_handles_labels()

    # 凡例をまとめて出力
    ax1.legend(
        handler1 + handler2,
        label1 + label2,
        loc="upper right",
        borderaxespad=0,
    )

    plt.savefig(f"./{city_code}_{city_name}.png")
    city_code += 1
```

雨温図を作成します。このグラフの作成の大部分はこの記事[^4]を参考にしました。

# おまけ

せっかく雨温図を作ったので、地域ごとに雨温図を見てみましょう。

## 北海道

![札幌](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1125965/8472e519-9549-7e05-8d71-fed211660ea3.png "札幌")

## 太平洋側

![13_東京.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1125965/36328fb6-033f-827e-399d-af329b5fb562.png)

## 日本海側

![15_新潟.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1125965/a846cbc5-c963-5a32-2da4-5401ffd0390b.png)

## 中央高地

![20_長野.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1125965/83ae036c-d6e7-096b-b044-01b1d0fb69b9.png)

## 瀬戸内

![37_高松.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1125965/45348167-39ed-7860-0af9-4694f2d96ef6.png)

## 南西諸島

![47_那覇.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1125965/6c863f6c-5c7f-f4fe-6b9c-bb7f98cecd25.png)

# おわりに

雨温図を自作することによって、地域ごとの気候の特徴がより分かりやすくなったと思います。ここまで読んでくださった方も、この記事によって少しでも地域ごとの気候に興味を持っていただけら幸いです。

[^1]: https://life-freedom888.com/pandas-csv-mojibake/
[^2]: https://hk29.hatenablog.jp/entry/2020/10/25/134840
[^3]: https://note.nkmk.me/python-pandas-read-excel/
[^4]: https://data-anal-ojisan.com/2020/08/26/229/