気象過去データの利用２（東京オリンピック期間の最高気温変遷）

気象庁が、2020年3月末まで、気象過去データを無償で提供しています。
(参考) 気象過去データの利用環境
https://www.data.jma.go.jp/developer/past_data/index.html

基本的な気象データは、「利用目的・対象を問わず、どなたでもご利用頂けます。」とのことなので、気象データを使って何か行っていきます。

気象庁の「過去の気象データ・ダウンロード」ページからもダウンロードできますが、まとめて一括してダウンロードできるため非常に便利です。
利用可能なデータは、以下の掲載されています。
https://www.data.jma.go.jp/developer/past_data/data_list_20200114.pdf

# データダウンロード
過去からの気温の情報を利用するため、「地上気象観測」－「時・日別値」を利用します。
このファイルには、観測開始～2019年10月までの気温や降水量をはじめとした観測情報が格納されています。
ファイルの形式については、以下を確認してください。
http://data.wxbc.jp/basic_data/kansoku/surface/format_surface.pdf

surfaceフォルダにファイルをダウンロードします。約2GBの容量があるため時間がかかります。


```python
import os
import urllib.request

# 地上気象観測　時・日別値ファイルダウンロード
url    = 'http://data.wxbc.jp/basic_data/kansoku/surface/hourly_daily_1872-2019_v191121.tar'
folder = 'surface'
path   = 'surface/hourly_daily_1872-2019_v191121.tar'
# フォルダ作成
os.makedirs(folder, exist_ok=True)
if not os.path.exists(path):
    # ダウンロード
    urllib.request.urlretrieve(url, path)
```

ファイルは、tar形式のため中身のファイルを確認します。

```python
# ファイル確認
import tarfile

# tarファイルに含まれるファイル確認
with tarfile.open(path, 'r') as tf:
    for tarinfo in tf:
        print(tarinfo.name)
```

中身は、hourly_daily_1872.tar.gzのようなtar.gzファイルでした。年ごとにtar.gzに固められています。
さらに展開が必要です。tar.gzファイルの内容を確認してみます。

```python
# ファイル確認2
import tarfile

# tarファイルに含まれるファイル確認
with tarfile.open(path, 'r') as tf:
    for tarinfo in tf:
        print(tarinfo.name)
        if tarinfo.isfile():
            # tar.gzファイルに含まれるファイル確認
            with tarfile.open(fileobj=tf.extractfile(tarinfo), mode='r') as tf2:
                for tarinfo2 in tf2:
                    if tarinfo2.isfile():
                        print('\t' + tarinfo2.name)
```

以下のようなファイルが存在することがわかります。
hourly_daily_1872/shd1872.430
ファイル名は、以下の形式とのことです。
shdYYYY.SSS （YYYY：西暦年、SSS：国際地点番号下３桁）

# 最高気温データの読み込み
東京の最高気温データを読み込みます。
tarファイル、tar.gzを展開せずに読み込みを行います。


東京の国際地点番号下３桁は、662です。
番号は、地点情報履歴ファイル（smaster_201909.tar.gz）で確認できます。
ファイルは、テキストの固定長の形式です。各項目の開始バイト数、長さがformat_surface.pdfに記載されていますので、それを基に文字列を切り出します。
たとえば、最高気温は、各レコードの1391～1394バイト目に格納されています。(pythonは、0オリジンのため、1390:1394と指定)
RMK（リマーク）に欠損情報が記載されているため、2以下を欠損としています。
3以上の場合でも、一部、推定値などがありますが、正常な値として扱っています。

データを格納用のpandasのデータフレームを用意します。
年を行、月日を列としてデータを格納します。

```python
# データ格納用データフレーム作成
import pandas as pd

tokyo_df = pd.DataFrame()
```

```python
# 最高気温データ取得
import tarfile

# 地点設定=東京
p_no = '662'

# tarファイルに含まれるファイルを取得
with tarfile.open(path, 'r') as tf:
    for tarinfo in tf:
        if tarinfo.isfile():
            # tar.gzファイルに含まれるファイルを取得
            with tarfile.open(fileobj=tf.extractfile(tarinfo), mode='r') as tf2:
                for tarinfo2 in tf2:
                    if tarinfo2.isfile():
                        # 地点が一致するファイルのみ読み込み
                        if tarinfo2.name[-3:] == p_no:
                            print(tarinfo2.name)
                            # ファイルをopen
                            with tf2.extractfile(tarinfo2) as tf3:
                                lines = tf3.readlines()
                                for line in lines:
                                    # データが含まれないファイルは無視
                                    if line[0:3] == b'   ':
                                        continue
                                    # 年
                                    year = line[14:18].decode()
                                    # 月日
                                    date = line[18:22].decode().replace(' ', '0')
                                    # 最高気温を取得
                                    hi_temp = int(line[1390:1394])
                                    # 0.1℃単に格納されているため、℃に変換
                                    hi_temp = hi_temp*0.1
                                    # 欠損処理(RMKが2以下の場合は欠損)
                                    hi_temp_rmk = int(line[1394:1395])
                                    if hi_temp_rmk <= 2 : hi_temp = None
                                    # データ格納
                                    tokyo_df.loc[year, date] = hi_temp
```

少し時間がかかりますが、東京の最高気温が取得できました。
データを確認してみましょう。

```python
# データ確認
tokyo_df
```

1875年からのデータが格納されていることがわかります。
期間をオリンピック期間に限定します。

```python
tokyo_olympic_df = tokyo_df.loc[:,'0724':'0809']
tokyo_olympic_df
```

7月24日～8月9日のデータになりました。

# 最高気温の表示
年ごとに気温をグラフにしてみます。

```python
import matplotlib.pyplot as plt

plt.figure(figsize=(20, 5))
plt.plot(tokyo_olympic_df.T)
plt.show()
```

![tokyo_temp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212365/ee659466-b993-5cf6-9a52-b2107e8ed678.png)

ごちゃごちゃしていますね。
平均値を表示します。1875～2019年の平均を青、最近10年の平均を赤とします。

```python
import matplotlib.pyplot as plt

plt.plot(tokyo_olympic_df.mean(), color='blue', label='1875-2019')
plt.plot(tokyo_olympic_df.loc['2010':'2019'].mean(), color='red', label='2010-2019')
plt.xticks(rotation=90)
plt.legend()
plt.show()
```

![tokyo_temp_mean.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212365/cc47dcee-5be8-bbe0-7028-05ae4b50feb6.png)

最近10年の方が明らかに高くなっていますね。
年ごとに、7月24日～8月9日の平均を確認してみます。

```python
import matplotlib.pyplot as plt

plt.figure(figsize=(20, 5))
plt.plot(tokyo_olympic_df.mean(axis='columns'), color='red')
plt.xticks(rotation=90)
plt.show()
```

![tokyo_temp_year_mean.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212365/4c37a0f9-6293-61bb-b803-4f006a094a61.png)

若干、上昇傾向に見えますね。

1875年～2019年までの各日の温度をヒートマップで表示します。

```python
import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(20, 30))
plt.imshow(tokyo_olympic_df, cmap='jet', vmin=20, vmax=35)
ax.set_xticks(np.arange(len(tokyo_olympic_df.columns)))
ax.set_yticks(np.arange(len(tokyo_olympic_df)))
ax.set_xticklabels(tokyo_olympic_df.columns, rotation=90)
ax.set_yticklabels(tokyo_olympic_df.index)
plt.colorbar()
plt.show()
```

![tokyo_temp_heatmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212365/37b0f238-86c0-3bcd-2184-a54b1fc6fd94.png)

年ごとに、色が濃くなっているようにも見えます。
ヒートマップに表示すると面白ですね。

参考までに、札幌のグラフです。

![sapporo_temp_heatmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212365/69bc6872-5e87-e964-eb3b-232ec7902350.png)

東京よりは、かなり涼しそうですが、昨年は暑かったようですね。

※ 東京の観測点は、何度か移転しています。ここに詳しく書かれています。
https://www.jma.go.jp/jma/kishou/minkan/koushu141114/shiryou1.pdf