Bonjour,
je dispose d'une table d'évenements avec pour chaque évenement un datetime et des coordonnées lat et lon :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 data events; format dt datetime. ; input eventid dt datetime18. lat lon; datalines; 1 07JAN2004:08:07:00 52.268157 -86.923828 2 09JAN2004:03:04:00 32.398516 -19.951172 3 13JAN2004:02:01:00 52.855864 -11.953125 4 01JAN2004:01:04:00 28.998532 -17.666016 ; run;
d'autre part j'ai des stations de mesure pour lesquelles je dispose de certains relevés avec datetime,lat,lon :
Je cherche à obtenir pour chaque évenement la mesure prise par la station la plus proche au moment le plus proche. (toutes les stations n'ont pas de mesures pour toutes les heures)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 data stations; format dt datetime. ; input staid dt datetime18. lat lon mes1; datalines; 1 07JAN2004:01:07:00 52.968157 -86.923728 11.2 2 09JAN2004:09:04:00 31.398316 -19.951172 4.6 3 13JAN2004:02:01:00 52.955864 -11.953125 7.0 4 01JAN2004:07:04:00 28.998532 -17.616016 -7.1 ; run;
actuellement je fais ceci est sql, je retiens pour chaque évenements, les mesures qui ont lieu dans n'importe quelle station avec +/- 3 heures et je garde uniquement la plus proche géographiquement, de ce résultat je garde la plus proche temporellement. je filtre ensuite les doublons pour éliminer les exequos.
Ce code fonctionne mais il est très lent pour un grand nombre d'évenements (~500k évenements vs 4M de mesures) et il ne permet pas de préciser des tolérences, pour par exemple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 proc sql; create table croisement as select * from ( select t0.*,t1.dt as dtmesure,t1.mes1,geodist(t0.lat,t0.lon,t1.lat,t1.lon) as distanceGeo,abs(t0.dt-t1.dt) as distanceTemps from events as t0,stations as t1 where abs(t0.dt-t1.dt)<3600*3 group by t0.idEvent having geodist(t0.lat,t0.lon,t1.lat,t1.lon)=min(geodist(t0.lat,t0.lon,t1.lat,t1.lon)) ) group by t0.idEvent having distanceTemps=min(distanceTemps); quit; proc sort data=croisement nodupkey; by idEvent; run;
prendre la deuxième station la plus proche si celle ci a une distance temporelle très petite par rapport à la plus proche.
Je me demandais si avec les procédures STAT(tree ? fastclus?) il n'y aurait pas mieux sans se lancer dans des algos d'optimisations compliqués ?
Je suis preneur de vos idées![]()
Partager