拡張アメダスから日平均気温を計算

タイトル画像は拡張アメダス(拡張AMeDAS、EA気象データ)の時刻別の気温1年分のグラフです。今回は年間の傾向を掴むため、Pythonでこのデータから日平均、平滑化の処理を行ってみます

拡張アメダスの読み込み

まずは何らかの方法で拡張アメダスのデータを読み込みます。以前に公開したパッケージがあるので、これを使って気温のデータを読み込みます。

weapyで拡張アメダスを読み込む

実際の処理はこんな感じ。拡張アメダス標準年のデータを読み込みます。さらに日平均気温の処理に備えて、気温からDataFrameを作成しておきます。

import weapy.weafile as ea
import pandas as pd
import plotly
import plotly.graph_objs as go


#拡張AMeDAS標準年、東京のデータを読み込む
weafile = r"F:\EAD\RWY0110.wea"
no =363 #東京[363]
elevation =0 #標高[m]
wea = ea.WeaFile(weafile, no, elevation)

#気温のデータでDataFrameを作成
df = pd.DataFrame({'TAMB': wea.ambient_temperatures})

indexに日付時刻を設定

日平均の処理のため、DataFrameのindexに日付時刻を設定します。pd.data_range()に開始日、期間、時間間隔を指定して1年分のデータを生成、カラムとして追加。そのカラムをindexに設定します。

#日付時刻のカラムを追加する
period = len(df.index) #年間のデータ数。通常は8760(=2hx365day)
step='1.0H'
df['datetime'] = pd.date_range('2010-01-01 0:00', periods=period, freq=step) # 2021/1/1 0:00開始、1時間ステップで1年のカラムを追加
df=df.set_index(df['datetime']) #'datetime'をDataFrameのindexへ設定
df=df.drop('datetime', axis=1)  #'datetime'は不要なので削除

日平均気温の計算

ここまで準備できたら、日平均を計算します。resample(“1D”)で1日分のデータを取りだして、あとはmean()で平均値を計算、新しいDataFrameへ保存します。

#日平均気温を計算して新しいDataFramを作成
daily_mean = df['TAMB'].resample("1D").mean()
df_daily_mean = pd.DataFrame({'mean':daily_mean})

この段階でグラフを描いてみます。時刻別のグラフに比べて年間の傾向が分かり易くなってきました。少し目を細めてみると、年間の傾向が見えます。

日平均気温

平滑化

さらに気温の傾向を分かり易くするため、日平均を平滑化します。今回は気象庁の平年値の計算に使われるKZ(Kolmogorov-Zurbenko)フィルターを使用します。

シンプルに9日間の移動平均を3回繰り返す方法で、簡単なコードで処理できます。

データの拡張

KZフィルターは当日と前後4日間の9日間の移動平均です。

ところが年末年始は移動平均の前後4日間のデータが確保できないため、予めデータを拡張します。

年始1/1を例にすると、その前の4日分必要です。移動平均は3回繰り返すので1/1から遡って12日分(=4日分×3回)のデータが必要です。図にするとこんな感じ↓です。年末のデータを1/1の前にコピペして追加します。

年末のデータも同様に、年始(1/1~1/12)の12日分をコピーして年末に追加します。

#移動平均の前処理として年末、年始のデータを拡張する
#9日間の移動平均(当日+前後4日間)×3回分として、年間データの前後に12日分(4日×3回)のデータを切り貼りする
daily_head = df_daily_mean.head(12) #年始12日分
daily_tail = df_daily_mean.tail(12) #年末12日分
df_daily_ext = daily_tail.append(df_daily_mean).append(daily_head)

移動平均

これで準備ができたので、9日間の移動平均を3回繰り返します。最後に拡張した年末年始の12日分のデータを取り除いたら完成です。

#移動平均
df_daily_mean_1=df_daily_ext.rolling(9,center=True).mean()
df_daily_mean_2=df_daily_mean_1.rolling(9,center=True).mean()
df_daily_mean_3=df_daily_mean_2.rolling(9,center=True).mean()
#年末年始の拡張分を取り除く
moving_average = df_daily_mean_3[12:]
moving_average = moving_average[:-12]

グラフに描くと図のようになります。赤い線がKZフィルターで処理したデータです。ここまでくると、もう目を細めなくても大丈夫。時刻平均や日平均に比べて年間の気温の変動がわかりやくすなります。

1月末から2月にかけて寒い期間、夏はやっぱり8月頃が最も暑い傾向が読み取れます。

※今回は日平均気温の計算、平滑化でしたが、ほぼ同様に日最高気温、最低気温も計算できます。

動作環境

以下の環境で動作を確認しています。
Windows10 Pro(64bit, 21H2)
Python 3.8.11
weapy 0.1.5

Pocket

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です