0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

概要

月間降水日数(日降水量が1mm以上の日数)を計算したいと思い,気象庁からデータを収集してプログラムを組んだという話です.

短いですが,記事にしてみました.

データ収集

地道な作業ですが,「気象庁|過去の気象データ・ダウンロード」から,各都道府県庁所在地を47つ選択し「日降水量」としてダウンロードしました.

今回は2018~2022年の5年間分のデータを集めました.

残念ながら,1回あたり半年ぶんくらいしかダウンロードできなかったので,2×5年分=10回にデータが分かれてしまいました.

データ処理

データを処理して集計します.

まず,1年分のデータが半年ずつになっているので1つにまとめて2018.csvなどとしました.
ついでに不要な行などは削除しておきました.

image.png

そうしましたら,降水日数の集計に取り掛かります.
集計処理全体のコードは以下のようになります.

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に対して,

  1. csv読み込み
  2. date列をdatetime型へ変換
  3. 余分な列を削除
  4. 日降水量1mm以上ならそのセルを1へ,1mm未満なら0へ置換
  5. .resample('M')を使って月毎に合計値を出す
  6. rainy_daysへ格納

という処理を行います.最後に,5年間分の降水日数平均をとったDataFrameも追加しておきます.

日降水量1mm以上は,気象庁の下記サイトに基づいています.

そして,結果を可視化したのがこちら.

京都府の2022年の各月の降水日数
京都_2022.png

各月の降水日数平均の,全都市に関する中央値
median_mean.png

やはり季節の変わり目にあたる3月,7月,9月とかは降水日数がやや多めですね.

ソースコードのYEARREGIONをいじればいろいろ試せるようになっています.

可視化部分
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の中に入っています.

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?