Pythonで天気データ(気温や湿度、天候状態など)を受信する方法
OpenWeatherMap.org から受信する
・Free weather data API for developers
・OpenWeatherMap API
・Weather Condition Codes
※ 日本国内のデータを受信したところ、気温がずれている印象を受ける。
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import urllib import json import datetime import pprint # OpenWeatherMap.org city id Tokyo = 1850147, Osaka = 1853909 LOCATION_ID = '1850147' # JSON形式データの受信 url = 'http://api.openweathermap.org/data/2.5/weather?units=metric&id=' + LOCATION_ID json_tree = json.loads( urllib.urlopen(url).read() ) # 受信エラーの場合、終了する if(str(json_tree['cod']) != '200'): print "Error" sys.exit() # デバッグ出力 pp = pprint.PrettyPrinter(indent=4) pp.pprint(json_tree) # 天気データの画面表示 print 'place = ' + json_tree['name'] # unixtimeをdatetimeに変換後書式代入する print 'time = ' + datetime.datetime.fromtimestamp(json_tree['dt']).strftime(u'%Y/%m/%d %H:%M:%S') print 'temperature = ' + str(json_tree['main']['temp']) print 'humidity = ' + str(json_tree['main']['humidity']) print 'pressure = ' + str(json_tree['main']['pressure']) print 'weather = ' + json_tree['weather'][0]['description'] print 'weather icon = ' + json_tree['weather'][0]['icon']
yahoo.com から受信する
・python-weather-api
・python-weather-api Examples of usage
・Yahoo Weather RSS Feed … 天気アイコンコードの説明
※ 日本国内のデータを受信したところ、データソースがMETARのようで、24時間空港以外は夜間はデータ更新されないようだ。
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import pywapi import pprint # Station ID of weather.com (ex. Tokyo = JAXX0085, Osaka = JAXX0071, New York = USNY0996, London = UKXX0085) STATION_ID = 'JAXX0085' try: result = pywapi.get_weather_from_yahoo(STATION_ID, 'metric') except: print "Error" sys.exit() # デバッグ出力 pp = pprint.PrettyPrinter(indent=4) pp.pprint(result) # 天気データの画面表示 print "place = " + result['location']['city'] print "time = " + result['condition']['date'] print "temperature = " + result['condition']['temp'] print "humidity = " + result['atmosphere']['humidity'] print "pressure = " + result['atmosphere']['pressure'] print 'weather = ' + result['condition']['text'] print 'weather icon = ' + result['condition']['code']
yahoo.comからは、次の方法でRSSデータを受信して使うこともできる。場所コードw=####
はWOEID
http://weather.yahooapis.com/forecastrss?w=1118370&u=c
weather.com から受信する
※ 日本のデータはエラーとなる場合がある
#!/usr/bin/env python # -*- coding: utf-8 -*- # https://code.google.com/p/python-weather-api/wiki/Examples import sys import pywapi import pprint # Station ID of weather.com (ex. Tokyo = JAXX0085, Osaka = JAXX0071, New York = USNY0996, London = UKXX0085) STATION_ID = 'UKXX0085' try: result = pywapi.get_weather_from_weather_com(STATION_ID, 'metric') except: print "Error" sys.exit() # デバッグ出力 pp = pprint.PrettyPrinter(indent=4) pp.pprint(result) # 天気データの画面表示 print "place = " + result['current_conditions']['station'] print "time = " + result['current_conditions']['last_updated'] print "temperature = " + result['current_conditions']['temperature'] print "humidity = " + result['current_conditions']['humidity'] print "pressure = " + result['current_conditions']['humidity'] print 'weather = ' + result['current_conditions']['text'] print 'weather icon = ' + result['current_conditions']['icon']
環境省 大気汚染物質広域監視システム そらまめ君から受信する
『環境省大気汚染物質広域監視システム そらまめ君API』にXMLとJSON形式での受診方法が書かれている。
preliminariesデータが、県ごとの最新データ一覧だが、毎時のデータ更新時間前後に受信ふかのうになる(2014年5月現在の状況)のため、weeksデータを受信する。
※ 測定値は2時間弱遅れて配信されているようだ
http://www.obccbo.com/soramame/v1/weeks/観測所コード.json
指定した観測局のデータは、「最新順」に格納されているようだが、今後ランダムになる可能性もあり、念の為各データ行を比較し最新のデータを取り出すようにpythonスクリプトを作成した
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import urllib import json import datetime import pprint # 測定局コード 国設大阪 = 27115010, 国設東京 = 13104010 LOCATION_ID = '27115010' url = 'http://www.obccbo.com/soramame/v1/weeks/' + LOCATION_ID + '.json ' json_tree = json.loads( urllib.urlopen(url).read() ) # JSONファイルから読み込む場合 #f = open('27115010.json', 'r') #json_tree = json.load( f ) #f.close() if(str(json_tree['status']) != 'OK'): print "JSON data Error" sys.exit() #pp = pprint.PrettyPrinter(indent=4) #pp.pprint(json_tree['data'][0]) print 'file time = ' + json_tree['datetime'] print 'data count = %d' % len(json_tree['data']) # 最新のデータのインデックスを求める i_new = 0 d_new = datetime.datetime(int(json_tree['data'][0]['year']), int(json_tree['data'][0]['month']), int(json_tree['data'][0]['day']), int(json_tree['data'][0]['time'][0:2])) for i in range(len(json_tree['data'])): # 大気汚染物質広域監視システムの時間表記が 01時〜24時であるため、0時から始まるよう修正 hour_tmp = int(json_tree['data'][i]['time'][0:2]) if hour_tmp >= 24: hour_tmp = 0 # datetime型に代入して、比較する(より新しいタイムスタンプのindexを取り出す) d = datetime.datetime(int(json_tree['data'][i]['year']), int(json_tree['data'][i]['month']), int(json_tree['data'][i]['day']), hour_tmp) if(d > d_new): d_new = d i_new = i d = datetime.datetime(int(json_tree['data'][i_new]['year']), int(json_tree['data'][i_new]['month']), int(json_tree['data'][i_new]['day']), int(json_tree['data'][i_new]['time'][0:2])) print "Newer date timestamp = " + d.strftime("%Y/%m/%d %H:%M:%S") print "temperature = " + json_tree['data'][i_new]['temp'] print "humidity = " + json_tree['data'][i_new]['hum'] print "wind = " + json_tree['data'][i_new]['ws'] + " (m/sec)" print "PM2.5 = " + json_tree['data'][i_new]['pm2.5'] + " (ug/m3)" print "NOX = " + json_tree['data'][i_new]['nox'] + " (ppm)" print "SO2 = " + json_tree['data'][i_new]['so2'] + " (ppm)" print "Ox = " + json_tree['data'][i_new]['so2'] + " (ppm)"