APIを使って1時間おきの天気予報を実装してみた
前回(APIを使って天気予報を実装してみた)のものに1時間おきの予報も追加してみました。(streamlitというフレームワークを使っています)
過去の予報を表示させても意味がないので、現在の時刻以降の予報だけを表示させる条件の設定。
まずは現在の時刻の取得。
from datetime import datetime, timezone, timedelta
now = datetime.now(timezone(timedelta(hours=9))).strftime("%H:%M")
必要なライブラリをインポートして、日本は協定世界時 (UTC)より+9時間になるので、timedelta(hours=9)を足して、簡単に比較できるようにするため、フォーマットをstrftime("%H:%M")の形式に。
if(now < "23:00"):
st.sidebar.write('<b>1時間おきの予報</b>', unsafe_allow_html=True)
23時以降は1時間おきの予報はもちろんないので、見出しも表示されないようにこう書きました。時刻の比較ですが、23:00というフォーマットにすると文字列ですが大小の比較ができるっぽいです。比較の方法としてこれが適切かどうかはいまいち疑問ですが、期待通りの結果を返してくれはします。(pythonでは文字列は文字コードで大小の比較がなされているそうです)
今回はじめて知ったのですが、streamlitでhtmlが使えるらしく文字を太くしたり色を付けたりもできるようです。これはとても便利。
あとはAPIから1時間おきのお天気情報を取得して、00:00から23:00まで23回回をfor文で回して表示させます。
hour_weather = weather["forecast"]["forecastday"][0]["hour"]
for hour in range(24):
if(hour_weather[hour]["time"][11:16] > now):
st.sidebar.write(hour_weather[hour]["time"][11:16])
icon_url24 = "https:" + hour_weather[hour]["condition"]["icon"]
img_read24 = urllib.request.urlopen(icon_url24).read() #画像データGET
img_bin24 = io.BytesIO(img_read24) #メモリに保持してディレクトリ偽装みたいなことする
st.sidebar.image(img_bin24)
st.sidebar.write("気温", hour_weather[hour]["temp_c"], "度", "降水確率", round(hour_weather[hour]["chance_of_rain"], -1), "%")
[11:16]は変数nowと同じフォーマットにして比較できるように11~16文字目を切り出しました。
今回は降水確率も出るようにしてみたのですが、これがなんと46とか21とか10%刻みになっていません。不思議に思って調べてみたところ、降水確率って実は10%刻みになるように四捨五入しているとのこと。よくよく考えてみれば当たり前のことで、膨大なデータから確率を出しているのでしょうから、うまい具合に10%刻みになるはずはありません。
APIのデータ通りに降水確率を1の位まで表示させても良かったのですが、間違っていると思われてもなんですし、馴染みもないと思いましたので、今回は四捨五入しました。
プログラミングを通して思わぬ発見がありました。
実装したサイトはこちらになります。
https://share.streamlit.io/pukumon/covid19-fukui/covid.py
この記事が気に入ったらサポートをしてみませんか?