【Python3】東京と○○県の暑さを可視化(DataFrame使い方メモ)

##0.日常に潜む問題

緊急事態宣言の中で迎える夏。
三密を徹底的に避けるために、遊びはおろか日頃から通ってアイデアを
もらっていたカフェにも行けず家に籠もっている。
話題といえば、コロナウィルスの感染者数と、暑さについてのみ。

都内に住む私としては、暑くて身動きが取れない話をしても、従姉妹や父からも地元も同じくらい暑い、暑い中でこんな運動(サイクリング)をしているなどの話を聞かされ、勝手に暑さ競争をされているようで辟易していた。

時々見るニュースでは、雪国でしられる地元は東京と変わりない位の最高気温を叩き出しているように見える。

地面から湯気が立っているのではないかと思うぐらいの暑さで、
10分歩いただけでフラフラする。
そしてカフェに入って冷たいドリンクを飲んでも、体中に充満した熱は簡単に取れない状態だ。
ドリンクを飲みながら、新潟と東京の暑さを最高気温で比較する方法を考えてみた。

##1．気温データの取得

[気象庁](https://www.data.jma.go.jp/gmd/risk/obsdl/index.php)から下記の手順で各地域の気象情報を取得することができた。
今回は新潟と東京のデータが必要なので、下記を東京の場合でも
実施して「csvファイルをダウンロード」ボタンを押す。

![qiita_weather_niigata1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689780/1dd12b11-b81a-7549-1243-4ed7d03007cb.jpeg)

![qiita_weather_niigata2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689780/fff2e4c0-62e5-f02f-c57f-46ecdd58b558.jpeg)

上記のcsvファイルの項目部分のみを使いやすいように編集した。

##２．様々な課題

(１)ＣＳＶファイルを読み込む

```python:weather_parse2.jpynb

import pandas as pd
import datetime as dt
#グラフを表示するライブラリ
import matplotlib.pyplot as plt
#日本語化のライブラリ
import japanize_matplotlib
#文字コードを指定して読み込む
df = pd.read_csv("data_weather2.csv",encoding="sjis")
print(df)

```

__出力結果__

```

           年月日  平均気温(℃)_東京  品質情報  均質番号  最高気温(℃)_東京  品質情報.1  均質番号.1  \
0     2020/1/1         5.5     8     1        10.2       8       1   
1     2020/1/2         6.2     8     1        11.3       8       1   
2     2020/1/3         6.1     8     1        12.0       8       1   
3     2020/1/4         7.2     8     1        12.2       8       1   
4     2020/1/5         5.4     8     1        10.2       8       1   
..         ...         ...   ...   ...         ...     ...     ...   
229  2020/8/17        30.8     8     1        36.5       8       1   
230  2020/8/18        30.3     8     1        34.3       8       1   
231  2020/8/19        29.0     8     1        34.2       8       1   
232  2020/8/20        29.7     8     1        34.8       8       1   
233  2020/8/21        30.1     8     1        36.0       8       1   

     最低気温(℃)_東京  品質情報.2  均質番号.2  平均気温(℃)_新潟  品質情報.3  均質番号.3  最高気温(℃)_新潟  \
0           3.2       8       1         3.6       8       1         5.6   
1           1.9       8       1         3.0       8       1         5.7   
2           1.4       8       1         4.2       8       1         6.9   
3           3.6       8       1         5.5       8       1         8.3   
4           0.6       8       1         4.2       8       1         7.2   
..          ...     ...     ...         ...     ...     ...         ...   
229        27.2       8       1        27.8       8       1        30.4   
230        27.8       8       1        26.3       8       1        29.0   
231        25.6       8       1        26.8       8       1        30.9   
232        25.8       8       1        28.5       8       1        33.7   
233        26.0       8       1        27.5       8       1        30.8   

     品質情報.4  均質番号.4  最低気温(℃)_新潟  品質情報.5  均質番号.5  
0         8       1         1.0       8       1  
1         8       1         2.0       8       1  
2         8       1         1.7       8       1  
3         8       1         2.4       8       1  
4         8       1         1.7       8       1  
..      ...     ...         ...     ...     ...  
229       8       1        26.3       8       1  
230       8       1        23.3       8       1  
231       8       1        22.0       8       1  
232       8       1        22.8       8       1  
233       8       1        23.8       8       1  

[234 rows x 19 columns]

```


(２)グラフ化する列の選択と範囲選択

__(メモ１)上記から列名1と列名2を選んで表示するには__

`DataFrame[[‘列名1’,’列名2’]]`と指定する。

__(メモ２)DataFrameの作成__

`DataFrame名=pd.DataFrame(データ,columns=指定したい列名のリスト)`

__(メモ３)列名３をデフォルトの日付型(yyyy-mm-dd)に変換するには__

`DataFrame名['列名３'] = pd.to_datetime(DataFrame名['列名３'], format='列名３の変更前のフォーマット')`

```python:weather_parse2.jpynb
new_columns = ['年月日', '最高気温(℃)_東京', '最高気温(℃)_新潟']  # カラム名
new_data=df[['年月日','最高気温(℃)_東京','最高気温(℃)_新潟']]

#dataframe再作成
new_df=pd.DataFrame(new_data,columns=new_columns)
#何もしない場合、日付タイプと認識されない
print(new_df.dtypes)
#年月日列を日付タイプに変換
new_df['年月日'] = pd.to_datetime(new_df['年月日'], format='%Y/%m/%d')
print(new_df.dtypes)
print(new_df)
```

__出力結果__

```
年月日            object
最高気温(℃)_東京    float64
最高気温(℃)_新潟    float64
dtype: object
年月日           datetime64[ns]
最高気温(℃)_東京           float64
最高気温(℃)_新潟           float64
dtype: object
           年月日  最高気温(℃)_東京  最高気温(℃)_新潟
0   2020-01-01        10.2         5.6
1   2020-01-02        11.3         5.7
2   2020-01-03        12.0         6.9
3   2020-01-04        12.2         8.3
4   2020-01-05        10.2         7.2
..         ...         ...         ...
229 2020-08-17        36.5        30.4
230 2020-08-18        34.3        29.0
231 2020-08-19        34.2        30.9
232 2020-08-20        34.8        33.7
233 2020-08-21        36.0        30.8

[234 rows x 3 columns]
```


```python:weather_parse2.jpynb

new_df2=new_df[(new_df['年月日'] >= dt.datetime(2020,8,1)) & (new_df['年月日'] < dt.datetime(2020,8,21))]
print(new_df2)

```
__出力結果__

```
           年月日  最高気温(℃)_東京  最高気温(℃)_新潟
213 2020-08-01        31.8        28.8
214 2020-08-02        31.5        30.3
215 2020-08-03        32.3        32.2
216 2020-08-04        33.1        32.7
217 2020-08-05        34.2        33.4
218 2020-08-06        33.1        33.6
219 2020-08-07        35.4        28.3
220 2020-08-08        32.3        24.8
221 2020-08-09        34.7        28.4
222 2020-08-10        35.2        35.6
223 2020-08-11        37.3        35.7
224 2020-08-12        35.8        31.4
225 2020-08-13        36.1        31.4
226 2020-08-14        34.2        32.0
227 2020-08-15        36.1        30.1
228 2020-08-16        35.4        31.4
229 2020-08-17        36.5        30.4
230 2020-08-18        34.3        29.0
231 2020-08-19        34.2        30.9
232 2020-08-20        34.8        33.7

```
+ 年月日がyyyy-mm-dd表示になっている。

(３)グラフ化

```python:weather_parse2.jpynb

#グラフ化したいデータを指定
new_columns3 = ['最高気温(℃)_東京', '最高気温(℃)_新潟']  # カラム名
new_data3=new_df2[['最高気温(℃)_東京','最高気温(℃)_新潟']]

new_df3=pd.DataFrame(new_data3,columns=new_columns3)
#グラフ表示
new_df3.plot()

```

![matplot_weather_before.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689780/7943cd6d-86d7-75af-16a1-5cb1aa703cdf.jpeg)

+ 横軸のインデックス値が行数になっているので、日付に対する温度の対応がわからない。
+ グラフが折れ線になっていて、比較がしにくい


##３．完成形(インデックスを日付に指定して、指定した期間の最高気温を出力する)

```python:weather_parse3.jpynb

import pandas as pd
import datetime as dt

#グラフを表示するライブラリ
import matplotlib.pyplot as plt
#日本語化のライブラリ
import japanize_matplotlib

#文字コードを指定して読み込む、年月日をインデックスに
df = pd.read_csv("data_weather2.csv",encoding="sjis")
#年月日をインデックスに
df.index=pd.to_datetime(df['年月日'], format='%Y/%m/%d').values
#もともとの列を削除
df = df.drop(columns='年月日')
print(df)

```


###出力結果

+ インデックスが日付型になっている。

```
            平均気温(℃)_東京  品質情報  均質番号  最高気温(℃)_東京  品質情報.1  均質番号.1  最低気温(℃)_東京  \
2020-01-01         5.5     8     1        10.2       8       1         3.2   
2020-01-02         6.2     8     1        11.3       8       1         1.9   
2020-01-03         6.1     8     1        12.0       8       1         1.4   
2020-01-04         7.2     8     1        12.2       8       1         3.6   
2020-01-05         5.4     8     1        10.2       8       1         0.6   
...                ...   ...   ...         ...     ...     ...         ...   
2020-08-17        30.8     8     1        36.5       8       1        27.2   
2020-08-18        30.3     8     1        34.3       8       1        27.8   
2020-08-19        29.0     8     1        34.2       8       1        25.6   
2020-08-20        29.7     8     1        34.8       8       1        25.8   
2020-08-21        30.1     8     1        36.0       8       1        26.0   

            品質情報.2  均質番号.2  平均気温(℃)_新潟  品質情報.3  均質番号.3  最高気温(℃)_新潟  品質情報.4  \
2020-01-01       8       1         3.6       8       1         5.6       8   
2020-01-02       8       1         3.0       8       1         5.7       8   
2020-01-03       8       1         4.2       8       1         6.9       8   
2020-01-04       8       1         5.5       8       1         8.3       8   
2020-01-05       8       1         4.2       8       1         7.2       8   
...            ...     ...         ...     ...     ...         ...     ...   
2020-08-17       8       1        27.8       8       1        30.4       8   
2020-08-18       8       1        26.3       8       1        29.0       8   
2020-08-19       8       1        26.8       8       1        30.9       8   
2020-08-20       8       1        28.5       8       1        33.7       8   
2020-08-21       8       1        27.5       8       1        30.8       8   

            均質番号.4  最低気温(℃)_新潟  品質情報.5  均質番号.5  
2020-01-01       1         1.0       8       1  
2020-01-02       1         2.0       8       1  
2020-01-03       1         1.7       8       1  
2020-01-04       1         2.4       8       1  
2020-01-05       1         1.7       8       1  
...            ...         ...     ...     ...  
2020-08-17       1        26.3       8       1  
2020-08-18       1        23.3       8       1  
2020-08-19       1        22.0       8       1  
2020-08-20       1        22.8       8       1  
2020-08-21       1        23.8       8       1  

[234 rows x 18 columns]

```


```python:weather_parse3.jpynb
#列の切り出し
new_columns = ['最高気温(℃)_東京', '最高気温(℃)_新潟']  # カラム名
new_data=df[['最高気温(℃)_東京','最高気温(℃)_新潟']]

#dataframe再作成
new_df=pd.DataFrame(new_data,columns=new_columns)

print(new_df)

```
###出力結果


```
 最高気温(℃)_東京  最高気温(℃)_新潟
2020-01-01        10.2         5.6
2020-01-02        11.3         5.7
2020-01-03        12.0         6.9
2020-01-04        12.2         8.3
2020-01-05        10.2         7.2
...                ...         ...
2020-08-17        36.5        30.4
2020-08-18        34.3        29.0
2020-08-19        34.2        30.9
2020-08-20        34.8        33.7
2020-08-21        36.0        30.8

[234 rows x 2 columns]

```



```python:weather_parse3.jpynb

new_df2=new_df['2020-08-01':'2020-08-21']
print(new_df2)

```

###出力結果
```
            最高気温(℃)_東京  最高気温(℃)_新潟
2020-08-01        31.8        28.8
2020-08-02        31.5        30.3
2020-08-03        32.3        32.2
2020-08-04        33.1        32.7
2020-08-05        34.2        33.4
2020-08-06        33.1        33.6
2020-08-07        35.4        28.3
2020-08-08        32.3        24.8
2020-08-09        34.7        28.4
2020-08-10        35.2        35.6
2020-08-11        37.3        35.7
2020-08-12        35.8        31.4
2020-08-13        36.1        31.4
2020-08-14        34.2        32.0
2020-08-15        36.1        30.1
2020-08-16        35.4        31.4
2020-08-17        36.5        30.4
2020-08-18        34.3        29.0
2020-08-19        34.2        30.9
2020-08-20        34.8        33.7
2020-08-21        36.0        30.8
```

```python:weather_parse3.jpynb

colorlist=["red","blue"]
#指定した色で棒グラフ表示
new_df2.plot.bar(color=colorlist)
#凡例の表示位置を右下に指定
plt.legend(loc="lower right")
plt.show()

```
###出力結果
![matplot_weather.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689780/fd3759de-2609-9127-bd1e-8d8dc07dc94a.jpeg)

##結論

最高気温は、東京の方が高い日が多い。