4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python3】 気象庁が公開している潮位データを1年分まとめて読み込む

Last updated at Posted at 2023-03-09

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あるのでグラフがとんでもない密度になっていますが、正しく描写で出来ていることが確認できました。
(tide.png

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?