
OpenWeatherMap APIを使って気圧変化を検知する
気圧変化が体調に不調を及ぼす、ことがあるらしい。(正確な情報かは不明)
様々なアプリが提供されているが、アプリを見ずに外出してしまう、自分に影響を及ぼす条件とアプリ情報が微妙にマッチしない。なので自作しよう、という試み。まずは気圧変化をいかに検知するか、まで本記事で試します。
【前提条件】
・天気情報はOpenWeatherMapというサービスのAPIを活用する。
利用のための手順は様々な記事があるので割愛。
基本的にはOpenWeatherMapのAPIドキュメントを参照しました。
・API とは何か、どのように使用するのかを知っている。
【やりたいこと】
・気圧値の変化度合いが3時間で2[hPa]上昇する時を検知したい。
・気圧上昇を検知したらLINE通知したい。(今回、未実装)
【書いてあること】
Python3を用いて、
・OpenWeatherMap APIで今から3時間毎の気圧値を取得する。
・2[hPa]以上の上昇があることを検知する。今回、上昇だけで良い。
【基礎知識】
・OpenWeatherMapサービスにID登録を行なった後、3時間毎の気象データを得るには、APIキーを取得して下記のような書式でrequestを送信する。
http://api.openweathermap.org/data/2.5/forecast?lat=緯度&lon=経度&appid=APIキー&lang=ja&units=metric
自宅周辺の情報を、言語は日本語、温度単位は摂氏で取得する場合。
・lat:緯度
・lon:経度
・appid:OpenWeatherMapに登録して取得するAPIキー
・lang:ja=日本語
・units:metric=摂氏
結果、json形式でこのような結果を取得できた。
気圧情報は [list][0-…][main][pressure]に入っていることが分かった。
なお、listの後ろ、0, 1, 2, …とあり、3時間毎、5日分のデータが格納される。
このデータを活用することを考える。

【作ったもの】(途中経過)
import requests
import json
import pandas as pd
from datetime import datetime, timedelta, timezone
url = "http://api.openweathermap.org/data/2.5/forecast?lat=緯度&lon=経度&appid=APIキー&lang=ja&units=metric"
jsondata = requests.get(url).json()
tz = timezone(timedelta(hours=+9), "JST")
df = pd.DataFrame()
for data in jsondata["list"]:
jst = str(datetime.fromtimestamp(data["dt"], tz))[:-9]
kiatsu = data["main"]["pressure"]
temp_data = pd.Series([jst, kiatsu])
df = df.append(temp_data, ignore_index=True)
print("df=")
print(df)
print("diff=")
print(df[1].diff())
for diff_kiatsu in df[1].diff():
sabun = diff_kiatsu
if sabun >= 2:
print("気圧急上昇")
【ざっくり解説】
・1-4行目:必要なモジュールを読み込む
・5行目:OpenWeatherMap APIのURLを定義する
・6行目:5行目で定義したURLにrequestを送り"jsondata"に格納する
・7行目:時刻を日本時間にするための補正を行う
OpenWeatherMap APIで取得できるのは標準時間のため
・8行目:空のデータフレームを作る
・9行目:取得したjsondataのうち "list"配下のデータがある限り繰り返す
・10行目:時刻補正した時刻情報を変数"jst"に格納。ただし末尾9桁は削除
※実データを見ると分かるが時刻データは詳細すぎるため末尾を削除
・11行目:気圧情報を変数"kiatsu"に格納
・12行目:一時的に [時刻, 気圧] の一次元データを作成
・13行目:8行目で作成したデータフレームに12行目で作成した一次元データを追記する
・14行目以降:想定通りのデータが取得できているかコンソールに表示して確認する
・18行目以降:取得した気圧情報のうち3時間毎の気圧差分が +2 以上の時、「気圧急上昇」とコンソールに表示する
【得られた結果】
ある程度、想定した通りのデータは取得できた。
一方で、気圧急上昇を検知した時の時刻が取得できてないことに気がついた。
df=
0 1
0 2022-11-05 12:00 1019.0
1 2022-11-05 15:00 1018.0
2 2022-11-05 18:00 1020.0
3 2022-11-05 21:00 1021.0
4 2022-11-06 00:00 1020.0
5 2022-11-06 03:00 1021.0
6 2022-11-06 06:00 1022.0
7 2022-11-06 09:00 1023.0
8 2022-11-06 12:00 1022.0
9 2022-11-06 15:00 1021.0
10 2022-11-06 18:00 1023.0
11 2022-11-06 21:00 1024.0
12 2022-11-07 00:00 1023.0
13 2022-11-07 03:00 1024.0
14 2022-11-07 06:00 1024.0
15 2022-11-07 09:00 1025.0
16 2022-11-07 12:00 1023.0
17 2022-11-07 15:00 1022.0
18 2022-11-07 18:00 1021.0
19 2022-11-07 21:00 1020.0
20 2022-11-08 00:00 1018.0
21 2022-11-08 03:00 1018.0
22 2022-11-08 06:00 1019.0
23 2022-11-08 09:00 1019.0
24 2022-11-08 12:00 1017.0
25 2022-11-08 15:00 1017.0
26 2022-11-08 18:00 1019.0
27 2022-11-08 21:00 1021.0
28 2022-11-09 00:00 1021.0
29 2022-11-09 03:00 1023.0
30 2022-11-09 06:00 1024.0
31 2022-11-09 09:00 1025.0
32 2022-11-09 12:00 1023.0
33 2022-11-09 15:00 1022.0
34 2022-11-09 18:00 1023.0
35 2022-11-09 21:00 1024.0
36 2022-11-10 00:00 1023.0
37 2022-11-10 03:00 1023.0
38 2022-11-10 06:00 1024.0
39 2022-11-10 09:00 1026.0
diff=
0 NaN
1 -1.0
2 2.0
3 1.0
4 -1.0
5 1.0
6 1.0
7 1.0
8 -1.0
9 -1.0
10 2.0
11 1.0
12 -1.0
13 1.0
14 0.0
15 1.0
16 -2.0
17 -1.0
18 -1.0
19 -1.0
20 -2.0
21 0.0
22 1.0
23 0.0
24 -2.0
25 0.0
26 2.0
27 2.0
28 0.0
29 2.0
30 1.0
31 1.0
32 -2.0
33 -1.0
34 1.0
35 1.0
36 -1.0
37 0.0
38 1.0
39 2.0
Name: 1, dtype: float64
気圧急上昇
気圧急上昇
気圧急上昇
気圧急上昇
気圧急上昇
気圧急上昇
【追記】
気圧急上昇を検知した時点の index を取得することで時刻を表示します。
enumerate() 関数を用います。ただし、気圧急上昇は1つ前の要素との差分のため、取得した indexの1個前の時刻から3時間で気圧が上昇する、という表示にします。
【修正した】
import requests
import json
import pandas as pd
from datetime import datetime, timedelta, timezone
url = "http://api.openweathermap.org/data/2.5/forecast?lat=緯度&lon=経度&appid=APIキー&lang=ja&units=metric"
jsondata = requests.get(url).json()
tz = timezone(timedelta(hours=+9), "JST")
df = pd.DataFrame()
for data in jsondata["list"]:
jst = str(datetime.fromtimestamp(data["dt"], tz))[:-9]
kiatsu = data["main"]["pressure"]
temp_data = pd.Series([jst, kiatsu])
df = df.append(temp_data, ignore_index=True)
for i, diff_kiatsu in enumerate(df[1].diff()):
sabun = diff_kiatsu
if sabun >= 2:
print(df[0][i-1],"から3時間で気圧急上昇")
【ざっくり解説】
・14行目以降:修正前の18行目以降を修正。for文を for in enumerate()とした。これにより、indexとデータの両方を取り出す。.diffをつけることでdf(データフレーム)の数値を一つ前の値との差(=気圧差)を得ている。
・15行目:気圧差を変数"sabun"に入れる。
・16行目:気圧差が2以上の時、17行目を実行する。
・17行目:i は取得したindex。人が読むには「●時から気圧急上昇」の表記が分かり易いので、1つ前の index に入っている時刻で表示する([i-1]の部分で取得したindexの1つ前のindexを指定している)。
・なお、修正前の 14行目に記載したコンソールへの出力は削除した。
【得られた結果】
2022-11-08 15:00 から3時間で気圧急上昇
2022-11-09 03:00 から3時間で気圧急上昇
2022-11-10 15:00 から3時間で気圧急上昇
2022-11-11 03:00 から3時間で気圧急上昇
2022-11-11 06:00 から3時間で気圧急上昇
【今後の展開】
以下の機能実装をどのようにして行うか、考えます。
・気圧急上昇を検知した内容をLINEで通知する(2022/11/6記事公開済み)