2022.3.11 :【修正】サンプルプログラムにcsv出力を追加
背景
- 気象庁では潮位表として、全国各地の験潮所の観測データ(潮位,干満など)を公開しています。
- 観測データの参考:https://www.data.jma.go.jp/kaiyou/db/tide/suisan/index.php
- Web上から手に入り大変便利ですが、フォーマットに癖があり、利用する際に少し苦労しました。
実行環境
- Macbook(M1)
- Docker
- VsCode
- Python3
観測データの保存フォーマットについて
気象庁は公開しているデータのフォーマットを丁寧に解説してくれています。
実際に中のデータを見てみると、以下の通りになっています。
108117121120116109104102105114126137143144137123105 85 66 51 44 46 57 7515 116QN 220121123214599999999999999 6551022017 4499999999999999
- 1~72カラム目に1時間ごとの潮位データが、1時間ごとに3カラムで保存されています。
- 73~78カラム目に年月日が保存されています。yymmddです。
- 79~80カラム目に観測点の固有の識別番号が保存されています。
- 81~136カラム目に満潮時刻・潮位と干潮時刻・潮位が保存されています。本記事では使いません。
この様にフォーマットに則って保存されていますが、利用する際にはいくつか注意点があります。
潮位の時刻データは1時間あたり3カラム必ず使用するため、観測潮位が2桁以下であった場合に左詰めでスペースが挿入されます。
また観測点の固有の識別番号にアルファベットが含まれています。
そのため数字として一括で読み取ることができません。
加えて、潮位の時刻データ以外にもデータが含まれているので、配列等に保管した際に欲しいデータの格納場所が飛び飛びになります。
解決策
一度データ全てを文字型として読み込み、それを3カラムごとに区切って配列に保管、スペース部分を削除します。
その後、潮位データのみを配列から取り出して配列に並べ直し解決しました。
サンプルプログラムを以下に示します。
(今回は実行結果を画像として保存しています。)
from pathlib import Path # ファイル検索用
import re # データ区切り用
import tqdm # 進捗バー表示
import matplotlib.pyplot as plt # グラフの描写
import numpy as np
import csv
tide_filepath = "Yokosuka-tide.csv"
tide_textdata = Path(tide_filepath).read_text()
tide_splittext = re.split("(...)", tide_textdata)[1::2]
tide_daycount = int(len(tide_splittext) / 45)
tide_data = [0] * 365 * 24
print(">>データの読み込み")
for i in tqdm.tqdm(range(tide_daycount)):
for j in range(24):
tide_data[i * 24 + j] = int(tide_splittext[i * 45 + j])
print(">>グラフの出力")
plt_x = np.arange(0, 365, 1 / 24) # x軸:hour
plt_y = tide_data # y軸:潮位データ
fig, ax = plt.subplots()
ax.plot(plt_x, plt_y, label="tide")
plt.xticks(np.arange(0, 365, 100)) # 横軸間隔の変更:day
ax.set_xlabel("day")
ax.set_ylabel("m")
ax.legend()
plt.savefig("tide.png")
print("save as tide.png")
print(">>CSVへの保存")
f = open("tide-out.csv", "w")
writer = csv.writer(f)
writer.writerow(tide_data)
f.close
print("save as tide-out.csv")
実行結果
今回は入力データとして、横須賀験潮所のデータを使用しています。
期間は2015年1月1日0時からの1時間潮位データです。
(この期間のデータには欠損がないため)
実行結果は下図の通りになります。
データ数が24h*365dayあるのでグラフがとんでもない密度になっていますが、正しく描写で出来ていることが確認できました。
(