LoginSignup
0
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-09-07

背景

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

作ったもの

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

  • Excelファイル

生成したExcelファイル

  • 雨温図

雨温図_札幌

環境

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

作成手順

データの取得

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

  • 地点

    • 各都道府県の県庁所在地
  • 項目

    • 月平均気温
    • 降水量の月合計
    • 「過去の平均値との比較オプション」の「平均値も表示」
  • 期間

    • 連続した期間で表示(2020年1月 ~ 2020年12月)
      (指定する年度は任意)
  • 表示オプション

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

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

気象データの整理

csvの読み込み

import pandas as pd

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

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

必要な部分の抽出

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

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

型の変換

df = df.astype("float")

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

Excelファイルへの書き出し

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ファイルの読み取り

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

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

雨温図の作成

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を参考にしました。

おまけ

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

北海道

札幌

太平洋側

13_東京.png

日本海側

15_新潟.png

中央高地

20_長野.png

瀬戸内

37_高松.png

南西諸島

47_那覇.png

おわりに

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

0
3
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
0
3