概要
月間降水日数(日降水量が1mm以上の日数)を計算したいと思い,気象庁からデータを収集してプログラムを組んだという話です.
短いですが,記事にしてみました.
データ収集
地道な作業ですが,「気象庁|過去の気象データ・ダウンロード」から,各都道府県庁所在地を47つ選択し「日降水量」としてダウンロードしました.
今回は2018~2022年の5年間分のデータを集めました.
残念ながら,1回あたり半年ぶんくらいしかダウンロードできなかったので,2×5年分=10回にデータが分かれてしまいました.
データ処理
データを処理して集計します.
まず,1年分のデータが半年ずつになっているので1つにまとめて2018.csv
などとしました.
ついでに不要な行などは削除しておきました.
そうしましたら,降水日数の集計に取り掛かります.
集計処理全体のコードは以下のようになります.
import pandas as pd
rainy_days = dict()
for year in range(2018,2023):
df = pd.read_csv(f'{year}.csv', encoding='shift-jis')
df['date'] = pd.to_datetime(df['date'], format='%Y/%m/%d')
df.set_index('date', inplace=True)
# '.1'がついていない列を抽出
df = df[df.columns[df.columns.str.contains('\.1') == False]]
# 1.0以上なら1、1.0未満なら0に変換
is_rain = df >= 1.0
is_rain = is_rain.astype(int)
# 月毎の降水日数
rainy_days_ = is_rain.resample('M').sum()
rainy_days_.index = rainy_days_.index.month
rainy_days_.index.name = 'month'
rainy_days[year] = rainy_days_.copy()
rainy_days['mean'] = sum([rainy_days[year] for year in range(2018,2023)]) / (2023-2018)
辞書型のrainy_days
に各年の降水日数が入ったDataFrameを格納していきます.
各年year
に対して,
- csv読み込み
- date列をdatetime型へ変換
- 余分な列を削除
- 日降水量1mm以上ならそのセルを1へ,1mm未満なら0へ置換
-
.resample('M')
を使って月毎に合計値を出す -
rainy_days
へ格納
という処理を行います.最後に,5年間分の降水日数平均をとったDataFrameも追加しておきます.
日降水量1mm以上は,気象庁の下記サイトに基づいています.
そして,結果を可視化したのがこちら.
やはり季節の変わり目にあたる3月,7月,9月とかは降水日数がやや多めですね.
ソースコードのYEAR
やREGION
をいじればいろいろ試せるようになっています.
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Meiryo'
REGION = '京都'
YEAR = 2022
if REGION in ['mean','median','max','min']:
result = rainy_days[YEAR].agg(REGION, axis=1)
else:
result = rainy_days[YEAR][REGION]
plt.bar(rainy_days[YEAR].index, result, zorder=2)
for i, v in enumerate(result):
plt.text(i+1, 0, f'{v:.1f}', ha='center', va='bottom', color='white')
plt.title(f'REGION={REGION}, YEAR={YEAR}')
plt.xlabel('月')
plt.ylabel('降水日数')
plt.xticks(np.arange(1,13))
plt.grid()
plt.show()
ソースコード
Qiitaアドベントカレンダーで使ったコードはこちらのレポジトリにまとめています.
本記事のコードは10-rainfall
の中に入っています.