Vous n'êtes pas identifié.
Vous êtes sur le forum du master ESA !
Le site du master ESA - description de la formation, notes de cours, contacts... vient de déménager !!!
Venez visiter notre nouveau site : www.master-esa.fr
Une étudiante de l'année 2004-2005 m'a contacté aujourd'hui pour me demander qu'il n'y avait pas dans SAS une fonction permettant de retrouver à partir d'une date la semaine dans l'année correspondant à cette date. Je lui réponds : la fonction "week"
Maintenant, il semblerait que la fonction week n'existe pas dans la version de SAS qu'elle utilise (8.2). comment faire pour retrouver le résultat donné par cette fonction si on n'a pas cette fonction ?
des bricolages de programmes sont toujours possibles - par exemple :
data bidon; input x ddmmyy10.; format x ddmmyy10.; Y=weekday(x); Z=x-'01jan2008'd; week=int((z+weekday('01jan2008'd))/7)+1; cards; 25/05/08 26/05/08 27/05/08 28/05/08 29/05/08 30/05/08 31/05/08 01/06/08 02/06/08 ; run;
bon, ce n'est pas trop joli - cela donne les résultats que l'on aurait avec la fonction week mais ce n'est pas sûr (et c'est même certain) que cela soit bon quelle que soit la date que l'on veut transformer - de plus, vous remarquerez que pour calculer week, il me faut une référence vers le permier jour de l'année considérée, cela va vite devenir pénible si je gère dans mon fichier des années différentes.
tiens, soyons plus efficase et créons plutôt un format spécifique grâce à PROC FORMAT :
data format ; retain fmtname "weeksansweekk" type "N" annee '01jan2000'd; do start="1jan2000"d to "31dec2010"d; if put(start,julday.)*1=1 then annee=start; if weekday(annee)>1 then label=int((put(start,julday.)*1+weekday(annee)-2)/7); else label=int((put(start,julday.)*1+weekday(annee)-2)/7)+1; output; end; drop annee; proc format cntlin=format; run; ** petit fichier pour voir si cela fonctionne" ; data bidon; input x ddmmyy10.; format x ddmmyy10.; coco=put(x, weeksansweekk.); cards; 25/05/2008 26/05/2008 27/05/2008 28/05/2008 29/05/2008 30/05/2008 31/05/2008 01/06/2008 02/06/2008 ; run; ** vérification que pour 2000-2010, ce que me donne la fonction week est bien identique à ce que j'observe par le passage par mon format spécifique"; data coco; do date='1jan2000'd to '31dec2010'd; week1=put(date,weeksansweekk.); week2=week(date); ctrl=week1-week2; output; end; run; proc freq data=coco; tables ctrl;run;
comme j'ai perdu deux heures à écrire ce malheureux bout de programme (erreur en déclarant la valeur de type dans le fichier format... quand vous créez un INFORMAT grâce à PROC FORMAT, type doit être égal à "I", j'ai donc pensé (bêtement) que type devait être égal à F puisqu'il s'agissait de créer un Format... - lorsque l'on crée un format, type est égal à N si votre format est numérique et C si c'est de l'alpha)
un peu de lecture ici : www.ats.ucla.edu/STAT/sas/library/nesug00/bt3001.pdf
cordialement
SR
Hors ligne
pas mal le bidouillage c'est ca que j'aime sous sas il y a tjrs une solution ...
par contre est ce que cette fonction existerait sur d'autres versions de sas la version 9 notamment?
Hors ligne
la fonction week existe bien sûr dans les versions 9 et ultérieures (par contre, je trouve vraiment étonnant que la fonction week n'existe pas en 8.2...)
cordialement
SR
Hors ligne