Pythonを使ってOpenWeatherMapから天気情報を取得し、グラフにする。

Pythonを使ってOpenWeatherMapから天気情報を取得し、グラフにする。

今回は、現在から5日間(3時間ごと)の天気を調べてみましょう。

さて、今回もOpenWeatherMapを利用して、天気情報を取得してみましょう。

尚、まだAPIキー取得をしていない方はこちらを参考にしてみてください。

それではAPIキーを取得している方は進んでいきましょう。

ナビの「API」をクリックして、少しスクロールすると「5day/3 Hour Forecast」(黄色マーカーで示されているところ)が現れ「API doc」をクリックします。


このような画面に移動します。

では、まず都市名で指定して天気情報を取得してみましょう。
import requests
import json
from pprint import pprint

url = “http://api.openweathermap.org/data/2.5/forecast?q={city name}&appid={API key}&lang=ja&units=metric”
url = url.format(city=”Tokyo”,key=”あなたが取得したAPIキー”)

jsondata = requests.get(url).json()
pprint(jsondata)

解説

import requests インターネットにアクセスするためのrequestsをimportします。
import json JSONを扱えるようにする標準ライブラリのjsonをimportします。
from pprint import pprintきれいに整形して表示することができる標準ライブラリのpprintをimportします。
“http://api.openweathermap.org/data/2.5/forecast?q={city name}&appid={API key}&lang=ja&units=metric”海外サイトなので、日本語表示にするためlang=ja、気温の単位も摂氏にするためunits=metricを追記しました。http://を追記しAPI callを貼り付けます。変数urlとし代入します。
url = url.format(city=”Tokyo”,key=”取得したAPIキー”)format文を使い、置き換えます。
jsondata = requests.get(url).json()getした値に.json()と命令して取り出します。
pprint(jsondata)取得したデータを表示します。

きれいに整形して表示されました。また3時間ごとのデータは「listの中に配列で入っている」ことも確認しておいてください。

確認できたところで、さっそく指定したデータを取り出していきましょう。

少し長いコードになりますが、少しずつ勉強していきましょう。

import requests
import json
from datetime import datetime, timedelta, timezone
url = “http://api.openweathermap.org/data/2.5/forecast?q={city name}&appid={API key}&lang=ja&units=metric”
url = url.format(city=”Tokyo”,key=”あなたが取得したAPIキー”)

jsondata = requests.get(url).json()
tz = timezone(timedelta(hours=+9), ‘JST’)
for dat in jsondata[“list”]:
    jst = str(datetime.fromtimestamp(dat[“dt”], tz))[:-9]

    weather = dat[“weather”][0][“description”]
    temp = dat[“main”][“temp”]
    print(“日時:{jst}, 天気:{w}, 気温:{t}度”.format(jst=jst, w=weather, t=temp))

解説

import requests インターネットにアクセスするためのrequestsをimportします。
import json JSONを扱えるようにする標準ライブラリのjsonをimportします。
from datetime import datetime, timedelta, timezone標準ライブラリのdatatimeのtimedeltaやtimezoneを使うと時間のずれを修正できます。
url = “http://api.openweathermap.org/data/2.5/forecast?q={city name}&appid={API key}&lang=ja&units=metric”海外サイトなので、日本語表示にするためlang=ja、気温の単位も摂氏にするためunits=metricを追記しました。http://を追記しAPI callを貼り付けます。変数urlとし代入します。
url = url.format(city=”Tokyo”,key=”取得したAPIキー”)format文を使い、置き換えます。
jsondata = requests.get(url).json()インターネットからgetした値に.json()と命令して取り出します。それを変数jsondataに代入します。
tz = timezone(timedelta(hours=+9), ‘JST’) 協定世界時から9時間後の日本標準時を求めます。それを変数tzに代入してます。
for dat in jsondata[“list”]: for文を使い、listの中から情報収集します。
jst = str(datetime.fromtimestamp(dat[“dt”], tz))[:-9] 求めた日本標準時を見やすいよう、strを使い後ろから9文字削除。それを変数jstに代入してます。
weather = dat[“weather”][0][“description”]weatherの配列から情報を取得します。それを変数weatherに代入します。
temp = dat[“main”][“temp”] mainの中のtempの情報を取得します。それを変数tempに代入します。
print(“日時:{jst}, 天気:{w}, 気温:{t}度”.format(jst=jst, w=weather, t=temp)) format文を使い、置き換えながら表示ます。

5日間、3時間ごとの天気情報を表示できました。


グラフで表示してみよう。

グラフ作成の前にまずは、グラフの元になる「何時に」「何度か」という表データを作らなければいけません。

外部ライブラリのpandasを使って空のDataFrameを作りましょう。

項目名を「気温」にして、「何時に」をインデックスにしていきます。

エクセルにすると、イメージとしてはこんな感じですね。

import requests
import json
from pprint import pprint
from datetime import datetime, timedelta, timezone
import pandas as pd
url = “http://api.openweathermap.org/data/2.5/forecast?q={city}&appid={key}&lang=ja&units=metric”
url = url.format(city=”Tokyo”,key=”あなたが取得したAPIキー”)

jsondata = requests.get(url).json()
df = pd.DataFrame(columns=[“気温”])
tz = timezone(timedelta(hours=+9), ‘JST’)
for dat in jsondata[“list”]:
    jst = str(datetime.fromtimestamp(dat[“dt”], tz))[:-9]
    temp = dat[“main”][“temp”]
    df.loc[jst] = temp
pprint(df)

解説

import requests インターネットにアクセスするためのrequestsをimportします。
import json JSONを扱えるようにする標準ライブラリのjsonをimportします。
from pprint import pprintきれいに整形して表示することができる標準ライブラリのpprintをimportします。
from datetime import datetime, timedelta, timezone標準ライブラリのdatatimeのtimedeltaやtimezoneを使うと時間のずれを修正できます。
import pandas as pd表データを読み込んで、データの追加、削除、抽出などを行える外部ライブラリをimportし、略してpdとします。
url = “http://api.openweathermap.org/data/2.5/forecast?q={city name}&appid={API key}&lang=ja&units=metric”海外サイトなので、日本語表示にするためlang=ja、気温の単位も摂氏にするためunits=metricを追記しました。http://を追記しAPI callを貼り付けます。変数urlとし代入します。
url = url.format(city=”Tokyo”,key=”取得したAPIキー”)format文を使い、置き換えます。
jsondata = requests.get(url).json()インターネットからgetした値に.json()と命令して取り出します。それを変数jsondataに代入します。
df = pd.DataFrame(columns=[“気温”])項目名=”気温”を読み取り、変数dfに代入します。DataFrameとは「表データをpandasライブラリで使えるようにしたデータ」
tz = timezone(timedelta(hours=+9), ‘JST’) 協定世界時から9時間後の日本標準時を求めます。それを変数tzに代入してます。
for dat in jsondata[“list”]: for文を使い、listの中から情報収集します。
jst = str(datetime.fromtimestamp(dat[“dt”], tz))[:-9] 求めた日本標準時を見やすいよう、strを使い後ろから9文字削除。それを変数jstに代入してます。
temp = dat[“main”][“temp”] mainの中のtempの情報を取得します。それを変数tempに代入します。
df.loc[jst] = tempdf.loc[]でデータを追加します。
print(df) 表示します

時間、気温、気温データが表示できました。これで表データをpandasで使えるDataFrameが作れたことになります。

準備ができました。それではグラフを作っていきましょう。

このDataFrameをグラフを作るmatplotlibライブラリを使って進めていきましょう。

import requests
import json
from pprint import pprint
from datetime import datetime, timedelta, timezone
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib

url = “http://api.openweathermap.org/data/2.5/forecast?q={city}&appid={key}&lang=ja&units=metric”
url = url.format(city=”Tokyo”,key=”あなたが取得したAPIキー”)

jsondata = requests.get(url).json()
df = pd.DataFrame(columns=[“気温”])
tz = timezone(timedelta(hours=+9), ‘JST’)
for dat in jsondata[“list”]:
    jst = str(datetime.fromtimestamp(dat[“dt”], tz))[:-9]
    temp = dat[“main”][“temp”]
    df.loc[jst] = temp

df.plot(figsize=(15,8))
plt.ylim(-10,30)
plt.grid()
plt.show()

解説

import requests インターネットにアクセスするためのrequestsをimportします。
import json JSONを扱えるようにする標準ライブラリのjsonをimportします。
from pprint import pprintきれいに整形して表示することができる標準ライブラリのpprintをimportします。
from datetime import datetime, timedelta, timezone標準ライブラリのdatatimeのtimedeltaやtimezoneを使うと時間のずれを修正できます。
import pandas as pd表データを読み込んで、データの追加、削除、抽出などを行える外部ライブラリをimportし、略してpdとします。
import matplotlib.pyplot as pltグラフを表示するときに使う外部ライブラリ、 matplotlib.pyplot as pltをimportして省略名pltを使います。
import japanize_matplotlibグラフ内の日本語が文字化けしないようにjapanize_matplotlibをimportします。
url = “http://api.openweathermap.org/data/2.5/forecast?q={city name}&appid={API key}&lang=ja&units=metric”海外サイトなので、日本語表示にするためlang=ja、気温の単位も摂氏にするためunits=metricを追記しました。http://を追記しAPI callを貼り付けます。変数urlとし代入します。
url = url.format(city=”Tokyo”,key=”取得したAPIキー”)format文を使い、置き換えます。
jsondata = requests.get(url).json()インターネットからgetした値に.json()と命令して取り出します。それを変数jsondataに代入します。
df = pd.DataFrame(columns=[“気温”])項目名=”気温”を読み取り、変数dfに代入します。DataFrameとは「表データをpandasライブラリで使えるようにしたデータ」
tz = timezone(timedelta(hours=+9), ‘JST’) 協定世界時から9時間後の日本標準時を求めます。それを変数tzに代入してます。
for dat in jsondata[“list”]: for文を使い、listの中から情報収集します。
jst = str(datetime.fromtimestamp(dat[“dt”], tz))[:-9] 求めた日本標準時を見やすいよう、strを使い後ろから9文字削除。それを変数jstに代入してます。
temp = dat[“main”][“temp”] mainの中のtempの情報を取得します。それを変数tempに代入します。
df.loc[jst] = tempdf.loc[]でデータを追加します。
df.plot(figsize=(15,8))折れ線グラフを作るplotを利用します。またfigsizeで画面の幅、高さを指定します。
plt.ylim(-10,30)最小値、最大値を指定します。
plt.grid()目盛線を表示させるgrid()を指定します。
plt.show()グラフを表示させます。

中年おじさんがここまで出来たので、あなたも必ずできます。共に勉強してみましょう。

*尚、ここではバージョン「Python 3.10.1」を使用しています。

この本から引用、参考に学び、完成させることができました。しかし、ここではプログラミング初心者の私が詳しく解説することは、おこがましく、難しく出来ません(ToT)
その点、この本では丁寧な解説が載っていますので、解説とともにコードを書き、完成させればより深く学ぶことができます(^.^)、実際、初心者の私でもわかりやすかったです。身に付け消えないスキルが2,000円程ならコスパよく、買っておいてよかったと満足してます。


わからないことはプロフェッショナルから学ぶのが一番

キャリアアップに必要なスキルを取得しよう。

オンラインで受講ができるスクールですので、全国どこからでも。