【Python3】東京の過去5年間の8月の暑さ比較をしてみた


##０．感覚：異様な暑さを感じる令和2年の夏

今年は、未だ解決が見えないコロナウィルスの到来、豪雨、コロナウィルスの
感染に伴う倒産など、様々な禍が押し寄せているように思える。
そして昨年にはない暑さを感じるのは、テレワークで家に長くいるせいなのか。
それにしても暑い。
前回は地元新潟と東京の温度を比較したが、今回は過去5年の東京の8月の温度を比較して、ストレスを感じる暑さが単なる気にし過ぎなのか検討してみたいと思う。

##1.気象庁からデータを取得

[気象庁](https://www.data.jma.go.jp/gmd/risk/obsdl/index.php)から下記の手順で各地域の気象情報を取得することができた。

![weather_comp_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689780/81349a96-96ea-3024-65e7-59683c5df76b.jpeg)

csvファイルの項目名部分は使いやすいように編集している。


##2.過去5年間のデータ表示コード

下記のコードは、jupyter notebook上で作成している。
このnotebook上での作成は、確認したいと思う場所で
実行して結果が確認できるところが便利なところだ。
表示しているコードも実行単位(セル)順で記載している。


```python3:weather_compare.jpynb

import pandas as pd
import datetime as dt
#グラフを表示するライブラリ
import matplotlib.pyplot as plt
#日本語化のライブラリ
import japanize_matplotlib
n_day=31

#文字コードを指定して読み込む
#2016年から2020年の8/1から8/31までのデータが入っている
df = pd.read_csv("data_weather_comp.csv",encoding="sjis")

print(df)

```

###実行結果

```
          年月日  平均気温(℃)  品質情報  均質番号  最高気温(℃)  品質情報.1  均質番号.1  最低気温(℃)  品質情報.2  \
0     2016/8/1     27.4     8     1     31.5       8       1     24.6       8   
1     2016/8/2     25.9     8     1     29.4       8       1     22.5       8   
2     2016/8/3     26.8     8     1     32.0       8       1     23.4       8   
3     2016/8/4     28.1     8     1     33.0       8       1     24.4       8   
4     2016/8/5     28.7     8     1     33.4       8       1     24.6       8   
..         ...      ...   ...   ...      ...     ...     ...      ...     ...   
150  2020/8/27     29.3     8     1     33.6       8       1     26.3       8   
151  2020/8/28     30.2     8     1     34.5       8       1     27.0       8   
152  2020/8/29     30.3     8     1     35.0       8       1     26.9       8   
153  2020/8/30     30.0     8     1     34.9       8       1     26.6       8   
154  2020/8/31     27.5     8     1     32.6       8       1     22.7       8   

     均質番号.2  
0         1  
1         1  
2         1  
3         1  
4         1  
..      ...  
150       1  
151       1  
152       1  
153       1  
154       1  

[155 rows x 10 columns]
```

###2.2 準備(データ列の絞り込み)

グラフ化したい列データを選ぶ。
下記関数の作成で全体のデータから、グラフ化したい列を切り出した
DataFrameを作成する事ができる。

```python:weather_compare.jpynb
def make_newDataframe(df,str_colname):
    
    #★全体から注目したい列データの切り出し
    #列の初期化
    new_columns=[]
    #年月日を追加
    new_columns.append('年月日')
    #str_colnameを追加
    new_columns.append(str_colname)
    new_data=df[new_columns]
    #dataframe再作成\
    new_df=pd.DataFrame(new_data,columns=new_columns)
    #print(new_df)
    return new_df



new_df_high=make_newDataframe(df,'最高気温(℃)')
print(new_df_high)
new_df_low=make_newDataframe(df,'最低気温(℃)')
print(new_df_low)
```

###実行結果

```
           年月日  最高気温(℃)
0     2016/8/1     31.5
1     2016/8/2     29.4
2     2016/8/3     32.0
3     2016/8/4     33.0
4     2016/8/5     33.4
..         ...      ...
150  2020/8/27     33.6
151  2020/8/28     34.5
152  2020/8/29     35.0
153  2020/8/30     34.9
154  2020/8/31     32.6

[155 rows x 2 columns]
           年月日  最低気温(℃)
0     2016/8/1     24.6
1     2016/8/2     22.5
2     2016/8/3     23.4
3     2016/8/4     24.4
4     2016/8/5     24.6
..         ...      ...
150  2020/8/27     26.3
151  2020/8/28     27.0
152  2020/8/29     26.9
153  2020/8/30     26.6
154  2020/8/31     22.7

[155 rows x 2 columns]
```


##2.3データ準備(5ヵ年の比較データ作成)

上記のデータを見ると、155行(8/1から8/31の過去5年間)の気温データが
保存されている事がわかる。
このままでは、過去5年間の温度を比較するためのグラフが作成できない。

`年月日　　　str_colname`
` 2016/8/1  xx.x `
` 2016/8/2  xx.x `
`..........`
`..........`
`..........`
` 2020/8/31 xx.x `

__を__

`年月   2016年度　　　2017年度   2018年度　　2019年度　　2020年度`
` 8/1   Xx.x.        Xx.x      Xx.x.     Xx.x.      Xx.x `
` 8/2   Xx.x.        Xx.x `
`. .....................`
`. .....................`
`. .....................`
` 8/31  xx.x         Xx.x      Xx.x.     Xx.x.      Xx.x `

のようにしてデータを整理する事が必要になる。
下記関数を作成することによって上記のデータに整えることができる。


```python3:weather_compare.jpynb

def make_newDataframe2(df,n_day,str_colname):

   
    new_df=make_newDataframe(df,str_colname)
    
    #過去5年間の8/1～8/n_dayまでのデータを横に並べるため
    tmp_md=[]
    for i in range(n_day):
        tmp_md.append(new_df.loc[i]['年月日'][5:])

    #★dataframe再作成
    new_df2=pd.DataFrame(data=tmp_md,columns=['月日'])

    #new_dfのstr_colnameのデータのみをtmp_dataに格納
    tmp_data=[]
    for i in range(5*n_day):
        tmp_data.append(new_df.loc[i][str_colname])
        
    for i in range(5):
        new_df2[str(2016+i)+'_'+str_colname]=tmp_data[i*n_day:(i+1)*n_day]
 
   
    #月日をインデックスに
    new_df2.index=new_df2['月日']
    #もともとの列を削除
    new_df2=new_df2.drop(columns='月日')

    return new_df2



new_df2_high=make_newDataframe2(df,n_day,'最高気温(℃)')
print(new_df2_high)

new_df2_low=make_newDataframe2(df,n_day,'最低気温(℃)')
print(new_df2_low)

```

###実行結果

```
      2016_最高気温(℃)  2017_最高気温(℃)  2018_最高気温(℃)  2019_最高気温(℃)  2020_最高気温(℃)
月日                                                                        
8/1           31.5          31.0          35.1          35.0          31.8
8/2           29.4          25.4          37.3          35.1          31.5
8/3           32.0          28.9          35.4          33.7          32.3
8/4           33.0          29.2          34.1          34.3          33.1
8/5           33.4          31.9          34.7          34.9          34.2
8/6           34.2          33.5          34.0          35.0          33.1
8/7           33.6          33.2          25.0          35.6          35.4
8/8           33.2          33.9          25.1          35.5          32.3
8/9           37.7          37.1          32.1          35.6          34.7
8/10          34.0          28.4          34.5          34.4          35.2
8/11          32.1          24.8          33.6          35.6          37.3
8/12          31.9          29.3          31.1          33.2          35.8
8/13          31.8          31.2          34.1          35.5          36.1
8/14          30.4          25.2          34.1          32.4          34.2
8/15          30.8          26.3          33.1          32.6          36.1
8/16          33.1          22.8          32.3          31.6          35.4
8/17          34.3          28.2          30.0          35.5          36.5
8/18          31.6          30.2          27.2          35.2          34.3
8/19          32.3          30.3          28.6          32.2          34.2
8/20          30.0          29.3          27.6          31.1          34.8
8/21          33.5          31.5          33.6          31.4          36.0
8/22          28.3          31.9          34.1          29.5          35.2
8/23          30.4          33.7          33.7          28.5          29.4
8/24          31.2          34.8          31.4          31.4          32.3
8/25          32.7          34.9          35.6          31.1          32.2
8/26          32.8          33.6          36.0          28.5          34.0
8/27          27.0          30.6          35.8          29.4          33.6
8/28          24.6          31.4          30.5          28.1          34.5
8/29          30.1          32.2          29.2          34.6          35.0
8/30          28.1          32.9          34.0          28.0          34.9
8/31          31.1          24.2          35.4          31.7          32.6
      2016_最低気温(℃)  2017_最低気温(℃)  2018_最低気温(℃)  2019_最低気温(℃)  2020_最低気温(℃)
月日                                                                        
8/1           24.6          22.7          24.8          26.3          21.8
8/2           22.5          20.9          26.7          27.1          22.6
8/3           23.4          20.2          27.3          25.7          22.3
8/4           24.4          22.0          26.1          25.3          24.5
8/5           24.6          24.6          27.2          25.1          25.7
8/6           25.8          26.3          25.0          27.5          25.5
8/7           24.5          25.9          20.8          26.7          26.0
8/8           25.3          26.9          21.6          26.0          25.1
8/9           25.7          25.9          23.8          26.2          23.4
8/10          26.0          22.4          27.0          25.7          26.9
8/11          25.2          21.7          26.0          25.3          27.0
8/12          24.2          21.0          25.6          25.6          27.3
8/13          23.3          23.1          24.6          26.9          25.4
8/14          23.5          23.4          23.9          27.1          24.9
8/15          24.4          22.4          27.2          25.9          26.9
8/16          23.7          21.1          25.8          28.0          28.0
8/17          23.0          20.9          21.3          27.3          27.2
8/18          25.2          24.0          18.3          26.5          27.8
8/19          25.0          22.4          19.4          25.7          25.6
8/20          24.1          22.4          20.9          24.1          25.8
8/21          23.5          24.1          23.7          23.6          26.0
8/22          23.2          24.4          26.9          23.2          24.0
8/23          24.2          24.7          26.2          24.0          23.2
8/24          23.5          26.4          26.3          24.0          23.0
8/25          23.5          25.8          27.6          20.7          24.8
8/26          24.0          26.1          26.4          22.9          24.3
8/27          21.6          23.2          24.5          22.8          26.3
8/28          21.3          22.3          23.5          23.2          27.0
8/29          22.1          25.2          24.1          24.7          26.9
8/30          22.5          24.1          25.0          24.2          26.6
8/31          22.5          20.0          25.1          24.3          22.7

```

##3．5年間のデータ(最高気温、最低気温)比較グラフ

```python3:weather_compare.jpynb

def makegraph(tmp_df):
    colorlist=["yellow","green","orange","blue","red"]

    #指定した色とサイズで棒グラフ表示
    tmp_df['8/1':'8/10'].plot.bar(figsize=(10,6),color=colorlist)
    #凡例の表示位置を右下に指定
    plt.legend(loc="lower right")
    tmp_df['8/11':'8/20'].plot.bar(figsize=(10,6),color=colorlist)
    plt.legend(loc="lower right")
    tmp_df['8/21':].plot.bar(figsize=(10,6),color=colorlist)
    plt.legend(loc="lower right")
    

makegraph(new_df2_high)
makegraph(new_df2_low)

```



![matplot_weather_comp1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689780/2899733a-6a0b-c193-e222-3ca0b8c5029a.jpeg)

![matplot_weather_comp2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689780/57fc705c-d923-f1d9-1af4-b14a6c325cd8.jpeg)

![matplot_weather_comp3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689780/f812f616-d05e-cde5-adfd-d1c25ec02ba4.jpeg)

![matplot_weather_comp1_low.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689780/22c8994b-09d0-0393-1f3f-69bc4da3f49c.jpeg)

![matplot_weather_comp2_low.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689780/df6ba837-f63c-bd93-08b8-37f868bff12d.jpeg)

![matplot_weather_comp3_low.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689780/b729c707-8b0d-146d-5654-f125f4e16b33.jpeg)

##4．結論

最低気温では、例年と比較して大きな特徴は見られないが、
最高気温のグラフを見ると、2020年の8月のほとんどが30度を超えている。
これが苦しくなるくらいの暑さの正体なのか、と少し納得している。

そして、DataFrameの使い方が理解できたということも収穫だった。