沖縄って東京より暑いの?
こういったtweetなんかもあって、沖縄と東京どっちあが暑いんだ?と思うようになり、実際どうなのか気象庁のデータを使ってみて沖縄と東京のどちらが暑いのかを何となく確認します。
対象データ
期間:2000年から2021年までの8月
元データ:気象庁 Japan Meteorological Agency(urlの詳細はコードに記載)
沖縄:那覇市のデータを用います
東京:大手町あたりのようです(詳しくはこちら)
コード
import
import pandas as pd import numpy as np import re import time import matplotlib.pyplot as plt import seaborn as sns import japanize_matplotlib
関数
マルチカラムをシングルカラムで取得
def get_converted_multi_columns(df): return ['_'.join(pd.unique(i).tolist()) for i in df.columns.values]
気象データのurlを取得
def base_path(prec_no, block_no, year): path=f'https://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no={prec_no}&block_no={block_no}&year={year}&month=8&day=&view=p1' return path
prec_noとblock_noは場所を示す情報を、yearには取得する西暦を渡します。
置換とfloat型へ変換
def replace_to_float(series): result=(series .astype(str) .replace(re.compile(r" \)$") , '' , regex=True) .astype(float) )
float型で入ると思っている列で文字列として入り、かつ不要な文字「' )'」が入っていることがあり、それを解消するための関数
気象データを取得
def temperature_august(years, location_info): lst_df_temperature=[] _TIME_SLEEP=5 for year in years: time.sleep(_TIME_SLEEP) prec_no, block_no, location=location_info url=base_path(prec_no, block_no, year) # 各西暦の8月のURL lst_df_read_html=pd.read_html(url) df_mult=lst_df_read_html[0] # マルチカラムを紐解く col=get_converted_multi_columns(df_mult) df_mult.columns = col # 西暦と場所のカラムを追加 df=(df_mult .assign(year=year) .assign(location=location) ) lst_df_temperature.append(df) # dfが入っているlistをコンキャットさせてインデックスを振りなおしてreturn return pd.concat(lst_df_temperature).reset_index(drop=True)
ウェブサイトからデータを取得してマルチカラムをシングルカラムにしたり、DataFrameに西暦と場所の列を追加し作成ています。
西暦のリストを作成
# 2000年から2021までの西暦を取得 YEAR_START=2000 YEAR_END=2021 lst_year = [ str(i) for i in range(YEAR_START,YEAR_END+1)]
場所の情報
# 数字はurlの情報で必要になり、文字列はDataframeの列に追加するために使用する okinawa=[91, 47936, "okinawa"] tokyo=[44, 47662, "tokyo"]
データを取得
df_okinawa=temperature_august(lst_year, okinawa) df_tokyo=temperature_august(lst_year, tokyo)
データの微修正
# indexを振りなおす df=(pd.concat([df_okinawa,df_tokyo]) .reset_index(drop=True) ) # 気温(℃)_最高の列に不要なもの(' )')が含まれているので削除してfloat型へ df['気温(℃)_最高']=replace_to_float(df['気温(℃)_最高']) df['気温(℃)_最低']=replace_to_float(df['気温(℃)_最低'])
平均気温の比較
sns.relplot(x='year' , y='気温(℃)_平均' , data=df , kind='line' , hue="location" , height=8, aspect=2.3 , legend=False , ci='sd') plt.ylim(0,40) plt.ylabel("平均気温(℃)", fontsize=24) plt.xlabel("西暦", fontsize=24) plt.tick_params(labelsize=18) plt.text(21.2,28.1,'沖縄',c='tab:blue',fontsize=20) plt.text(21.2,26.6,'東京',c='tab:orange',fontsize=20) plt.show()
最高気温の比較
sns.relplot(x='year' , y='気温(℃)_最高' , data=df , kind='line' , hue="location" , height=8, aspect=2.3 , legend=False , ci='sd') plt.ylim(0,40) plt.ylabel("最高気温(℃)", fontsize=24) plt.xlabel("西暦", fontsize=24) plt.tick_params(labelsize=18) plt.text(21.2,30.1,'沖縄',c='tab:blue',fontsize=20) plt.text(21.2,32.0,'東京',c='tab:orange',fontsize=20) plt.show()
最低気温の比較
sns.relplot(x='year' , y='気温(℃)_最低' , data=df , kind='line' , hue="location" , height=8, aspect=2.3 , legend=False , ci='sd') plt.ylim(0,40) plt.ylabel("最高最低(℃)", fontsize=24) plt.xlabel("西暦", fontsize=24) plt.tick_params(labelsize=18) plt.text(21.2,26.1,'沖縄',c='tab:blue',fontsize=20) plt.text(21.2,23.6,'東京',c='tab:orange',fontsize=20) plt.show()
所感
どちらが暑いかは何とも言えない感じになったかなという印象。
最低気温は沖縄と比較して東京のほうが涼しいかも。
沖縄は大体同じような気温が多い。
東京は気温の変化が大きい。
└日毎も日内変動も変化が大きそう
最高気温
最高気温は特にどちらが暑いかは言えなさそう。東京と比較すると沖縄は最高気温の変化(幅)が少なく大体同じような最高気温。東京は暑い時もあれば、比較的厚さが和らいでいる日もある。
最低気温
東京のほうが最低気温は低そう。ただし日毎の変化が大きいのでもしかしたら沖縄よりも最低気温が高い日があるかも。
まとめ
最低気温は東京のほうが涼しいけど最高気温と平均気温は沖縄も東京も似たような感じになるかもね。だけど東京は日毎の気温の変化が大きいので日によっては東京のほうが涼しい日もあれば暑い日もありそうだねって感じでしたー