Da questa pagina meteonetwork Associazione MeteoNetwork - Radiosondaggi possiamo estrarre i radiosondaggi di varie stazioni in questo formato
cioè con una linea per ogni sondaggio e le temperature a 850, 700 e 500 hPa, e la possibilità di specificare la data di inizio e di fine.Codice:Data e ora ZT 850hPa 700hPa 500hPa (UTC) H(m) H(m) T(°C) H(m) T(°C) H(m) T(°C) ----------------------------------------------------------- 01/07/11 h00 3668 1504 14.6 3115 2.8 5760 -15.1 01/07/11 h06 3317 1498 12.8 3101 1.6 5730 -14.7 01/07/11 h12 3413 1497 12.6 3095 2.4 5740 -13.3 02/07/11 h00 3206 1489 11.2 3081 1.0 NP NP 02/07/11 h06 2803 1477 9.4 3055 -1.7 5680 -14.3 02/07/11 h12 2737 1467 8.6 3043 -1.1 5660 -15.3 03/07/11 h00 2955 1470 10.4 3055 -0.7 5670 -15.3 03/07/11 h06 3165 1460 9.8 3047 0.8 5690 -11.7 03/07/11 h12 3828 1469 11.0 3067 3.6 5730 -11.1 04/07/11 h00 3776 1486 15.0 3100 4.8 5760 -11.7 04/07/11 h06 3948 1487 12.6 3098 4.4 5750 -12.9 04/07/11 h12 3647 1503 12.4 3109 4.4 5760 -12.3 05/07/11 h00 3643 1490 14.2 3100 3.8 5750 -12.9 05/07/11 h06 3482 1486 13.8 3092 2.6 5740 -13.1 05/07/11 h12 3896 1495 14.8 3106 2.8 5760 -11.1 06/07/11 h00 4019 1506 16.8 3128 5.6 5800 -10.5 06/07/11 h06 3877 1493 14.4 3107 3.8 5760 -11.7 06/07/11 h12 3781 1486 15.8 3103 5.4 5770 -9.5
Avrei bisogno di reperire una fonte che mi permetta di estrarre radiosondaggi nello stesso formato - a dire il vero mi basterebbero le temperature a 850 hPa - ma non so dove andarli a pescare. Presso il noto sito U-Wayoming (Wyoming Weather Web) non riesco a estrarre i sondaggi in questo formato. In quel sito riesco a estrarre più sondaggi, ma me li dispone in output in un modo non facilmente governabile, perché mi dà sempre l'intera colonna d'aria.
Qualcuno può segnalarmi una fonte da cui possa estrarre i radiosondaggi in un formato analogo a quello Meteonetwork e dove si trovi un po' tutto il mondo?
![]()
Non so aiutarti nel reperire altri fonti, ma sei proprio sicuro di non essere in grado di gestire quell'output?
Con MATLAB si fa abbastanza rapidamente ...
Stazione meteo: Davis Vantage Vue; Luogo: Molino del Piano, 12 km a NE di Firenze; Alt.: 120 m; Sito web: www.firenzemeteo.it
Per il formato di cui riporto un campione non c'è problema ovviamente, perché sono forniti solo i sondaggi a 850 hPa e ogni dato che mi interessa si trova, per ogni linea, sulla stessa colonna. Tipico formato fixed con una riga per campione.
Quello che non è agevole da gestire, da uwyoming, è ciò che esce qui:
Atmospheric Soundings
Prova a vedere se riesci a impostare una data di inizio, una data di fine, e a estrarre le temperature a 850 hPa nell'intervallo di tempo ottenendo una linea per sondaggio. A me cambiando i contenuti del secondo dialog esce di tutto, ma mai in quel formato, e mai più di un mese. Quest'ultimo dettaglio potrebbe anche andare bene...
Prova questo:
University of Wyoming - Radiosonde Data
Escono tutti i radiosondaggi di Belgrado dal 1° luglio al 31 luglio 2010, e fin qui va bene. La temperatura è nelle colonne da 17 e 22, e fin qui va bene. Solo che escono anche tutte le altre quote:
non solo 850 hPa; anche questo può andare bene ma in questo caso non va bene a me. Altro problemino, la data del sondaggio è presente una sola volta, in riga 1 ma non in colonna 1, e questo complica un bel po' le cose.Codice:13275 Beograd Observations at 00Z 01 Jul 2010 ----------------------------------------------------------------------------- PRES HGHT TEMP DWPT RELH MIXR DRCT SKNT THTA THTE THTV hPa m C C % g/kg deg knot K K K ----------------------------------------------------------------------------- 1000.0 121 991.0 203 18.8 17.3 91 12.69 230 4 292.7 328.9 294.9 976.0 333 17.6 16.9 96 12.60 275 25 292.8 328.7 295.0 972.0 368 17.3 16.9 97 12.57 280 27 292.8 328.7 295.0 966.0 421 16.8 16.7 99 12.53 288 25 292.8 328.6 295.0 938.0 672 19.0 14.3 74 11.04 323 12 297.5 329.8 299.5 929.0 754 18.7 14.7 78 11.45 335 8 298.1 331.6 300.1 927.0 773 18.7 14.8 78 11.55 345 8 298.2 332.0 300.3 925.0 791 18.6 14.9 79 11.65 350 8 298.3 332.4 300.4 909.0 941 18.6 12.6 68 10.18 15 9 299.8 329.9 301.6 906.0 969 18.4 12.4 68 10.11 20 10 299.9 329.8 301.7 850.0 1513 14.4 9.4 72 8.78 40 19 301.2 327.4 302.8
Scendendo nell'output troviamo che la temperatura a 850 del 1° ore 00Z è in riga 18, quella delle ore 12Z è in riga 170, quella delle 00Z del giorno 2 è in riga 318 e avanti così. Per cui la cosa è molto complicata da manipolare e se per caso il passo tra le righe con le temperature che mi servno non è costante diventa estremamente laborioso estrarle.
Se da qualche parte ci fosse un ODBC al quale ci si può connettere, potrei fare una query lì e tirare fuori quello che mi serve. Ma c'è?![]()
Forse ho trovato.
Posso usare il formato qui sopra, e poi
1) importare il testo come appunto testo con una sola riga (trattare i dati proprio come testo)
2) eliminare tutte le righe che non contengono la stringa "observations" e che non contengono la stringa " 850.0".
3) a quel punto posso creare una variabile data manipolando un po' le stringhe delle righe contenenti "observations". (eliminando dalla stringa il codice del radiosondaggio, la parola "observations", il nome del radiosondaggio, la parola "at", quello che resta è la data. Ovviamente il mese è in formato letterale, sarebbe troppo comodo se me lo dessero già in formato numerico. Questo non mi costringerebbe a ricodificarlo, e quindi esporrebbe la mia anima a gravi pericoli. Meglio fare un po' di purgatorio in vita ricodificando manualmente.
4) ...e creare una variabile contenente i contenuti delle colonne da 17 a 22 se la riga inizia per " 850.0".
A quel punto resta il problema di accoppiare la data/ora a ogni riga di dati del tempo corrispondente. Cacchio, capisco perché i programmatori fumano come turchi e bevono secchi di caffé. Se devono lavorare come muli per gestire dati formattati da cani come questi, non resta altra consolazione che ricorrere a sostanze.
Poi mi potrei chiedere se vale la pena di fare un'ora di programmazione per conoscere la temperatura media a 850 hPa sopra Belgrado nel luglio 2010, e concludo prontamente che non ne vale affatto la pena.![]()
Copia questo codice e crea il file sounding.m .... va! ... poi ti mando la fattura
Un paio di cose:
1) Per scaricare i dati di Belgrado (codice stazione 13275) del 1 luglio 2010 ora UTC 00 devi lanciare da matlab la seguente istruzione:
sounding(2010,7,1,0,13275)
cioè inserire nell'ordine anno, mese, giorno, ora, codice stazione
2) Questa funzione ti crea un file .dat ben formattato in cui i dati assenti sono sostituiti da NaN
3) Per caricarlo in matlab ti basta un load (la prima riga, con l'header contenenti le grandezze è stata commentata con %)
4) Importante: questo codice contiene dei controlli che mettono in pausa la query quando ad esempio il server è sovraccarico oppure quando ti bloccano l'ip. Io lo utilizzai massivamente con vari cicli for per scaricarmi una importante serie climatologica: dopo un po' ti bloccano perchè c'è un numero massimo di query orarie per stesso ip
5) Se ti vuoi divertire scaricando radiosondaggi non europei, devi sostituire nel codice il campo "europe" con quello del continente che desideri
Codice:function sounding(anno,mese,giorno,ora_UTC,staz_number) %Inserire anno nel formato YYYY! staz_number=num2str(staz_number); stringa_anno=num2str(anno); if mese<10 %mi assicuro che la stringa mese sia nella forma MM stringa_mese=['0' num2str(mese)]; else stringa_mese=['0' num2str(mese)]; end if giorno<10 %mi assicuro che la stringa giorno sia nella forma DD stringa_giorno=['0' num2str(giorno)]; else stringa_giorno=['0' num2str(giorno)]; end if ora_UTC<10 %mi assicuro che la stringa ora sia nella forma DD stringa_ora_UTC=['0' num2str(ora_UTC)]; else stringa_ora_UTC=['0' num2str(ora_UTC)]; end disp(['Tento il download del radiosondaggio del ' stringa_giorno '/' stringa_mese '/' stringa_anno ... ' ora ' stringa_ora_UTC ' UTC per la stazione numero ' staz_number]) blocco_ip=0; rinuncia_radiosondaggio=0; conta_blocco_html=0; conta_blocco_ip=0; while blocco_ip==0 if conta_blocco_ip<=3 try %a volte non permette nemmeno il dwl, per questo metto un try and catch!!! url=(['http://weather.uwyo.edu/cgi-bin/sounding?region=europe&TYPE=TEXT%3ALIST&YEAR=' ... stringa_anno ... '&MONTH=' stringa_mese '&FROM=' stringa_giorno stringa_ora_UTC '&TO=' ... stringa_giorno stringa_ora_UTC '&STNM=' staz_number]); ok_internet=0; while ok_internet==0 conta_blocco_html=conta_blocco_html+1; max_wait=15000; if conta_blocco_html<=3 try s=urlread2(url,[],[],max_wait); ok_internet=1; catch disp(['Lettura html num ' num2str(conta_blocco_html) ' bloccata '... '...riavvio tra 30 secondi ....']); pause(30) end else %se ho già fatto 3 tentativi, ci rinuncio ok_internet=1; %esco dal while rinuncia_radiosondaggio=1; end end %fine while ok_internet==0 if rinuncia_radiosondaggio~=1 %se non ci sono stati problemi con la lettura html test_blocco=(findstr(s,'You are making too many data requests')); test_busy=(findstr(s,'Sorry, the server is too busy to process your request')); if size(test_blocco,1)~=0 %se ti ha bloccato l'ip conta_blocco_ip=conta_blocco_ip+1; disp('Blocco IP, riprovo tra 1 minuto ....') pause(60*1) elseif size(test_busy,1)~=0 %se il server è in sovraccarico disp('Server sovraccarico, riprovo tra 1 minuto ....') conta_blocco_ip=conta_blocco_ip+1; pause(60*1) else blocco_ip=1; %esco dal while end else %se invece ho avuto problemi con la lettura html blocco_ip=1; %esco dal while end catch conta_blocco_ip=conta_blocco_ip+1; disp('Blocco IP, riprovo tra 1 minuto ....') pause(60*1) end else rinuncia_radiosondaggio=1; blocco_ip=1; %esco dal while end end %fine while blocco_ip==0 if rinuncia_radiosondaggio~=1 %se è presente la voce cant'get, allora il radiosondaggio non è presente test_00=(findstr(s,'Can''t get')); %stringa in caso di radiosondaggio non presente test_01=(findstr(s,'Invalid TIME parameter')); %stringa in caso di data non accettabile if size(test_01,1)~=0 %se è sbagliata la data disp(['Data ' stringa_giorno '/' stringa_mese '/' ... stringa_anno ' ora ' stringa_ora_UTC ' UTC NON ACCETTABILE!']); disp('------------------------------------------------') elseif size(test_01,1)==0&&size(test_00,1)==0 %se è presente il radiosondaggio, creo un file di testo %con il profilo copio il contenuto della pagina web in file di testo ok_internet=0; while ok_internet==0 max_wait=15000; try urlwrite2(url,'temp.dat',[],[],max_wait); ok_internet=1; catch disp('Dwl html bloccato...riavvio ....'); pause(5) end end %fine while ok_internet==0 %...lo carico fid_spc=importdata('temp.dat'); %... e seleziono la parte contenente i dati dati=fid_spc.data; tot_righe_dati=size(dati,1); trova_inizio=(findstr(s,'-----------------------------------------------------------------------------')); s(1:(trova_inizio(2)+78))=[]; trova_fine=(findstr(s,'</PRE>')); s(trova_fine(1):size(s,2))=[]; profilo_prs=[]; profilo_hgt=[]; profilo_temp=[]; profilo_dwpt=[]; profilo_ur=[]; profilo_mixr=[]; profilo_dir_vento=[]; profilo_int_vento=[]; try % metto un try and catch perchè a volte sbaglia a calcolare il numero di righe totali (??) for riga=1:tot_righe_dati for colonna=1:8 indice_inizio=78*(riga-1)+1+7*(colonna-1); indice_fine=indice_inizio+6; valore=str2num(s(indice_inizio:indice_fine)); if size(valore,2)==0 valore=NaN; end if colonna==1 profilo_prs=[profilo_prs valore]; %#ok<AGROW> elseif colonna==2 profilo_hgt=[profilo_hgt valore]; %#ok<AGROW> elseif colonna==3 profilo_temp=[profilo_temp valore]; %#ok<AGROW> elseif colonna==4 profilo_dwpt=[profilo_dwpt valore]; %#ok<AGROW> elseif colonna==5 profilo_ur=[profilo_ur valore]; %#ok<AGROW> elseif colonna==6 profilo_mixr=[profilo_mixr valore]; %#ok<AGROW> elseif colonna==7 profilo_dir_vento=[profilo_dir_vento valore]; %#ok<AGROW> elseif colonna==8 profilo_int_vento=[profilo_int_vento valore]; %#ok<AGROW> end end %fine for colonna=1:8 end %fine for riga=1:tot_righe_dati catch end %creo la matrice con i dati del radiosondaggio matrice_dati=[profilo_prs' profilo_hgt' profilo_temp' profilo_dwpt' profilo_ur' ... profilo_mixr' profilo_dir_vento' profilo_int_vento']; %della matrice con i dati del radiosondaggio, poto tutte quelle righe %in cui è assente il dato temperatura (3° colonna) ok_nan=0; while ok_nan==0 trova_nan=find(isnan(matrice_dati(:,3))==1); if size(trova_nan,1)~=0 %se esiste un NaN elimino la riga matrice_dati(trova_nan(1),:)=[]; else %se non esiste esco dal while ok_nan=1; end %fine if size(trova_nan,2)~=0 end %fine while ok_nan==0 %convero i nodi in m/s matrice_dati(:,8)=matrice_dati(:,8)*0.5144; clear trova_nan %scrivo il file con i dati del radiosondaggio fid_spc=fopen(['sounding_' stringa_anno stringa_mese stringa_giorno... '_' stringa_ora_UTC 'Z.dat'],'w'); fprintf(fid_spc,'%s','%P[hPa], Z[m], T[°C], DP[°C], RH[%], MR[g/kg], DRCT[°], SKNT[m/s] '); fprintf(fid_spc,'\n'); for i=1:size(matrice_dati,1) fprintf(fid_spc,'%7.1f %6.0f %+7.1f %+7.1f %5.0f %10.2f %8.0f %8.1f \n'... ,matrice_dati(i,:)); end fclose(fid_spc); disp(['Radiosondaggio del ' stringa_giorno '/' stringa_mese '/' ... stringa_anno ' ora ' stringa_ora_UTC ' UTC scaricato da Internet']); disp('------------------------------------------------') %cancello il temp.dat delete('temp.dat') else disp(['Radiosondaggio del ' stringa_giorno '/' stringa_mese ... '/' stringa_anno ' ora ' stringa_ora_UTC ' UTC NON presente']); disp('-------------------------------------') end %fine if size(test_01,1)~=0 ED ALTRI ELSEIF! else disp(['IMPOSSIBILE SCARICARE radiosondaggio del ' stringa_giorno '/' stringa_mese ... '/' stringa_anno ' ora ' stringa_ora_UTC ' UTC ']); end
Ultima modifica di Controcorrente; 15/07/2011 alle 10:58
Stazione meteo: Davis Vantage Vue; Luogo: Molino del Piano, 12 km a NE di Firenze; Alt.: 120 m; Sito web: www.firenzemeteo.it
E la maremma, che lavoro!
Spero proprio che tu non lo abbia fatto apposta per rispondere alla mia query e che ce l'avessi già lì, altrimenti mi sentirei decisamente in colpa.
Non ho Matlab e non lo maneggio ma visto che ho il pomeriggio libero credo che inizierò a interessarmene.
Grazie.![]()
Circa questo problema, puoi aggirarlo usando un proxy gratuito. Non sono veloci, non sono sicuri (puoi ovviare blindando un po' il pc con firewall a manetta) ma ti consentono di aggirare i blocchi basati sull'IP. Fai andare il tuo programma, ogni tanto lo metti in pausa, cambi IP e riparti per ancora un po' di iterazioni, poi ri-cambi IP eccetera. Ti vedono un po' dall'Arabia, un po' dalla Turchia, un po' da Ferrara, un po' dal Canada eccetera e se non hanno una blacklist di open proxy (come ce l'ha ad esempio Wikipedia, che li blocca in edit) ti fai i lavori che ti servono senza essere bloccato.
500 sterline per una licenza student? Matlab
Dopo "bio-ladri" per il negozio di alimenti biologici vicino a casa mia, "meteo-loladri" per altri commercianti in giro per il mondo, mi tocca coniare il termine "stat-ladri"
Credo proprio che farò a meno di Matlab. Vediamo se trovo online qualche libreria analoga per R.
Trovata libreria per R.
CRAN - Package RadioSonde
Basta che non richieda di metterci manualmente i dati ma sia capace di leggerseli da sé da uwyoming...
Segnalibri