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

この記事が気に入ったらサポートをしてみませんか?