Supondo que temos a seguinte tabela em PostgreSQL
CREATE TABLE meteo_aeroportos(
unico character varying(15),estacao_cod character(4), data date,
t_max real, t_med real, t_min real,o_max real, o_med real, o_min real,
h_max real, h_med real, h_min real,pa_max_in real, pa_med_in real, pa_min_in real,
vi_max_km real, vi_med_km real, vi_min_km real,v_max_kh real, v_med_kh real,
vr_max_kh real, p_tot real, neblosidade real, descricao character varying(50),
id serial primary key);
e aproveitando a disponibilidade de dados meteorológicos dos aeroportos pela página de Weather Underground e com recurso a um pequeno script de Pytthon podemos ter uma base de dados com os últimos dados meteorologicos dos aeroportos que desejamos, neste caso utilizarei apenas os da Peninsula Ibérica.
#coding: latin-1
import os
import urllib2
from BeautifulSoup import BeautifulSoup
import datetime
import psycopg2
def meteo_aero(base_de_dados, utilizador, host, senha):
conn = psycopg2.connect("dbname='%s' user='%s' host='%s' password='%s'" % (base_de_dados, utilizador, host, senha))
cur = conn.cursor()
print '\n Aeroportos'
aeroportos = ['BGC', 'BGZ', 'CHV', 'CVU', 'FAO', 'FLW', 'FNC', 'GRW', 'HOR', 'LIS', 'LPBJ', 'LPEV', 'OPO', 'PDL', 'PIX', 'PRM', 'PXO', 'SJZ', 'SMA', 'TER', 'VRL', 'AGP', 'ALC', 'BCN', 'BIO', 'BJZ', 'EAS', 'GRO', 'GRX', 'IBZ', 'LCG', 'LEGA', 'LEGT', 'LEI', 'LERT', 'LPA', 'MAD', 'MJV', 'ODB', 'OVD', 'OZP', 'PMI', 'PNA', 'REU', 'SCQ', 'SDR', 'SLM', 'SVQ', 'TFN', 'TFS', 'TOJ', 'VGO', 'VIT', 'VLC', 'VLL', 'XRY', 'ZAZ']
print 'Descarregar e inserir...'
for a in aeroportos:
sql = "select extract(year from max(data)), extract(month from max(data)), extract(day from max(data)) from dados.meteo_aeroportos where estacao_cod = '%s';" % a
cur.execute(sql)
rows = cur.fetchall()
for row in rows:
ano_i = int((row[0]))
mes_i = int((row[1]))
dia_i = int((row[2]))
url = 'http://www.wunderground.com/history/airport/%s/%s/%s/%s/CustomHistory.html?dayend=30&monthend=05&yearend=2009&req_city=NA&req_state=NA&req_statename=NA&format=1' % (a, ano_i, mes_i, dia_i)
page = urllib2.urlopen(url)
sopa = BeautifulSoup(page)
sopa = list(sopa)
n = len(sopa[2:-4])
x = 1
while x < n:
if (x % 2 == 0):
linha = str(sopa[x]) + ','+ a
linha = str(linha).replace(',,', ',null,')
linha = str(linha).replace(',,', ',null,')
linha = str(linha).replace('\n', '')
data = linha.split(',')[0]
t_max = round(((float(linha.split(',')[1]) -32) / 1.8), 2) if linha.split(',')[1] <> 'null' else linha.split(',')[1] # c = (f-32) / 1.8
t_med = round(((float(linha.split(',')[2]) -32) / 1.8), 2) if linha.split(',')[2] <> 'null' else linha.split(',')[2] # c = (f-32) / 1.8
t_min = round(((float(linha.split(',')[3]) -32) / 1.8), 2) if linha.split(',')[3] <> 'null' else linha.split(',')[3] # c = (f-32) / 1.8
o_max = round(((float(linha.split(',')[4]) -32) / 1.8), 2) if linha.split(',')[4] <> 'null' else linha.split(',')[4] # c = (f-32) / 1.8
o_med = round(((float(linha.split(',')[5]) -32) / 1.8), 2) if linha.split(',')[5] <> 'null' else linha.split(',')[5] # c = (f-32) / 1.8
o_min = round(((float(linha.split(',')[6]) -32) / 1.8), 2) if linha.split(',')[6] <> 'null' else linha.split(',')[6] # c = (f-32) / 1.8
h_max = (linha.split(',')[7])
h_med = (linha.split(',')[8])
h_min = (linha.split(',')[9])
pa_max_in = linha.split(',')[10]
pa_med_in = linha.split(',')[11]
pa_min_in = linha.split(',')[12]
vi_max_km = round((float(linha.split(',')[13]) * 1.609344), 2) if linha.split(',')[13] <> 'null' else linha.split(',')[13] # Km = miles * 1.609344
vi_med_km = round((float(linha.split(',')[14]) * 1.609344), 2) if linha.split(',')[14] <> 'null' else linha.split(',')[14] # Km = miles * 1.609344
vi_min_km = round((float(linha.split(',')[15]) * 1.609344), 2) if linha.split(',')[15] <> 'null' else linha.split(',')[15] # Km = miles * 1.609344
v_max_kh = round((float(linha.split(',')[16]) * 1.609344), 2) if linha.split(',')[16] <> 'null' else linha.split(',')[16] # Km = miles * 1.609344
v_med_kh = round((float(linha.split(',')[17]) * 1.609344), 2) if linha.split(',')[17] <> 'null' else linha.split(',')[17] # Km = miles * 1.609344
vr_max_kh = round((float(linha.split(',')[18])* 1.609344),2)if linha.split(',')[18] <> 'null' else linha.split(',')[18] # Km = miles * 1.609344
p_tot = round((float(linha.split(',')[19]) * 25.4),2) if linha.split(',')[19] <> 'null' else linha.split(',')[19] # mm = in * 25,4
neblosidade = (linha.split(',')[20])
descricao = (linha.split(',')[21])
estacao_cod = (linha.split(',')[22])
sql = "INSERT INTO dados.meteo_aeroportos ( \
data, t_max, t_med, t_min, o_max, o_med, o_min, h_max, h_med, h_min, pa_max_in, pa_med_in, pa_min_in, vi_max_km, vi_med_km, vi_min_km, v_max_kh, v_med_kh, vr_max_kh, p_tot, neblosidade, descricao, estacao_cod) \
VALUES ('%s', %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, '%s', '%s');" % (data, t_max, t_med, t_min, o_max, o_med, o_min, h_max, h_med, h_min, pa_max_in, pa_med_in, pa_min_in, vi_max_km, vi_med_km, vi_min_km, v_max_kh, v_med_kh, vr_max_kh, p_tot, neblosidade, descricao, estacao_cod)
cur.execute(sql)
else:
pass
x = x + 1
conn.commit()
print 'Eliminar repetidos...'
sql = 'create temp table meteo_aeroportos_t1 as select unico from dados.meteo_aeroportos group by unico having count(unico) > 1;'
cur.execute(sql)
sql = 'create temp table meteo_aeroportos_t2 as select max(id) as id, unico from dados.meteo_aeroportos group by unico having count(unico) > 1;'
cur.execute(sql)
sql = 'delete from dados.meteo_aeroportos where dados.meteo_aeroportos.unico in (select meteo_aeroportos_t1.unico from meteo_aeroportos_t1) and id not in (select id from meteo_aeroportos_t2);'
cur.execute(sql)
conn.commit()
conn.close()
meteo_aero('base_de_dados', 'utilizador', 'host', 'senha')