
html
マリンスポーツのシーズンになる前に、天気・暑さ・潮位予報を良い感じに通知したくなりました。
この3つを網羅したお天気アプリで中々いいのがなかったため、Pythonで自作することにしました!

気象庁は天気予報をJSON形式で公開しており、規約の範囲で使用できます。
また環境省は暑さ指数をCSV形式で公開しており、こちらも規約の範囲で使用できます。
これらをrequests.getすることで、疑似APIのように各種予報を取得できるようにしました。
天気予報を取得するコード
#天気
import requests
import datetime
import json
#地点コードを設定
# https://www.jma.go.jp/bosai/common/const/area.json に掲載されている
areacode = '016000' #"石狩・空知・後志地方"
print(areacode)
#気象庁から情報取得・デコード
raw_wea1 = requests.get('https://www.jma.go.jp/bosai/forecast/data/forecast/' + areacode + '.json')
see_wea1 = eval(raw_wea1.content.decode()) #デコード
#天気を取得して出力
weathers = see_wea1[0]['timeSeries'][0]['areas'][0]['weathers']
winds = see_wea1[0]['timeSeries'][0]['areas'][0]['winds']
print(weathers)
print(winds)
天気予報の出力結果
>>> 016000
>>> ['くもり\u3000朝\u3000から\u3000昼過ぎ\u3000晴れ\u3000所により\u3000昼前\u3000まで\u3000霧', 'くもり\u3000朝\u3000から\u3000昼過ぎ\u3000晴れ']
>>> ['北の風', '南東の風\u3000後\u3000南の風\u3000やや強く']
掲載コードでは天気・風向きだけですが、風速・気温も取得することができます!
暑さ予報のコード
#暑さ
import requests
import datetime
import json
#地点コードを設定
# https://www.wbgt.env.go.jp/man15NH/R04_wbgt_data_service_manual.pdf に掲載されている
areacode = '54232' #新潟
print(areacode)
#今日と明日の年月日 '20220203'
today = str(format(datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9),'JST')),'%Y%m%d'))
tomrw = str((datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9),'JST')) + datetime.timedelta(days=1)).strftime('%Y%m%d'))
#気象庁から情報取得・デコード・整形
raw_wbgt = requests.get('https://www.wbgt.env.go.jp/prev15WG/dl/yohou_all.csv')
list_wbgt = raw_wbgt.content.decode().split('\n')
for i in range(len(list_wbgt)):
list_wbgt[i] = list_wbgt[i].split(',')
#動作したのが12時以前なら今日の12時、12時以後なら明日の12時の暑さ指数を取得
for row in range(len(list_wbgt[1])):
if list_wbgt[0][row] == today + '12': break
if list_wbgt[0][row] == tomrw + '12': break
#暑さ指数を温度基準に変換して出力
for i in range(len(list_wbgt)):
if list_wbgt[i][0] == areacode:
if int(list_wbgt[i][row]) < 21*10:
print('ほぼ安全')
elif int(list_wbgt[i][row]) < 25*10:
print('注意')
elif int(list_wbgt[i][row]) < 28*10:
print('警戒')
elif int(list_wbgt[i][row]) < 31*10:
print('厳重警戒')
else:
print('危険')
暑さ予報の出力結果
>>> 54232
>>> 警戒
暑さは単純な気温だけではなく、湿度や輻射熱も考慮する必要があります。
同じ気温でも木陰なら熱中症にならない、湿度が高いと体の熱を冷ませない、といった状態になるからです。
これらを考慮した暑さの指数がWBGT値です。
CSVからはWBGT値を10倍した値が取得できるので、
閾値も10倍することで温度基準(‘警戒’など)に換算できます。
潮位予報のコード
#潮位
import requests
import datetime
import json
#地点コードを設定
# https://www.data.jma.go.jp/kaiyou/db/tide/suisan/station.php に掲載されている
areacode = 'WH' #宇部
print(areacode)
#年月日整形
year = str(format(datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9), 'JST')) ,'%Y')) #'2022'
mont = str(format(datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9), 'JST')) ,'%m')) #'02'
days = str(format(datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9), 'JST')) ,'%d')) #'07'
if mont[0:1] == '0':
mont = ' ' + mont[1:2] #' 2'
if days[0:1] == '0':
days = ' ' + days[1:2] #' 7'
#気象庁から情報取得・デコード
raw_tid1 = requests.get('https://www.data.jma.go.jp/gmd/kaiyou/data/db/tide/suisan/txt/' + year + '/' + areacode + '.txt')
see_tid1 = raw_tid1.content.decode()
for i in range(0,8):
high = int(see_tid1[see_tid1.find( mont + days + areacode )+10+7*i:see_tid1.find( mont + days + areacode )+13+7*i])
if high == 999:continue #データなし999は除外
hour = see_tid1[see_tid1.find( mont + days + areacode )+ 6+7*i : see_tid1.find( mont + days + areacode )+8+7*i]
mins = see_tid1[see_tid1.find( mont + days + areacode )+ 8+7*i : see_tid1.find( mont + days + areacode )+10+7*i]
time = hour.replace(' ', '0') +':' + mins.replace(' ', '0')
print([time, high])
潮位予報の出力結果
>>> WH
>>> ['02:17', 330]
>>> ['14:23', 284]
>>> ['08:37', 148]
>>> ['20:36', 127]
潮位はこのように、その日の満潮・干潮になる全ての時刻と潮位が得られます。
これでマリンスポーツをいっぱい楽しむぞう!
プログラミングを学び始めで何をやっていいか分からない・独学で限界を感じている人は、一度スクールで学ぶのもオススメ!↓
