12 May 2014

(Python) 天気データの受信

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)"