Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/06/2011, 12h13   #1
Nouveau Membre du Club
 
Inscription : juillet 2009
Messages : 74
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juillet 2009
Messages : 74
Points : 27
Points : 27
Par défaut Problème de format, recherche format année-semaine

Bonjour,

je ne connais vraiment pas grand chose au code sas.
Extrait du code sas existant, permettant d'extraire les 12 dernières périodes :

A noter que la période en entrée est de format 201101 pour janvier 2011.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
DATA tmp.periode;
SET tmp.periode;
id_perio_m1 = put(intnx('month',input(id_perio,yymmn6.),-1),yymmn6.);
id_perio_m2 = put(intnx('month',input(id_perio,yymmn6.),-2),yymmn6.);
id_perio_m3 = put(intnx('month',input(id_perio,yymmn6.),-3),yymmn6.);
id_perio_m4 = put(intnx('month',input(id_perio,yymmn6.),-4),yymmn6.);
id_perio_m5 = put(intnx('month',input(id_perio,yymmn6.),-5),yymmn6.);
id_perio_m6 = put(intnx('month',input(id_perio,yymmn6.),-6),yymmn6.);39         id_perio_m7 = put(intnx('month',input(id_perio,yymmn6.),-7),yymmn6.);
id_perio_m8 = put(intnx('month',input(id_perio,yymmn6.),-8),yymmn6.);
id_perio_m9 = put(intnx('month',input(id_perio,yymmn6.),-9),yymmn6.);
id_perio_m10 = put(intnx('month',input(id_perio,yymmn6.),-10),yymmn6.);
id_perio_m11 = put(intnx('month',input(id_perio,yymmn6.),-11),yymmn6.);
 
run;

J'aimerais reprendre ce code pour extraire les 52 dernières périodes, maintenant mon format d'entrée étant 201113 : 13ème semaine de l'année 2011.

Y'a-t-il un format pour cela?

Comment créer à partir de rien un format? et comment l'utiliser?

Merci de votre aide !
StéphanieB. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 12h31   #2
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
hello, Je ne suis pas sûr d'avoir bien compris.

je te propose un extrait du SAS HELP.
tu l'adapte à ton cas.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
options pageno=1 nodate ls=80 ps=64;
 
title 'Values of the U, V, and W Descriptors';
DATA a(DROP=i date0 date1 y);
     date0 = '20dec2005'd;
     do y = 0 TO 5;
        date1 = intnx("YEAR",date0,y,'s');
        do i = 0 TO 20;
          date = intnx("DAY",date1,i);
          year = YEAR(date);
          week   = week(date); 
          week_u = week(date, 'u'); 
          week_v = week(date, 'v'); 
          week_w = week(date, 'w'); 
          output;
        end;
     end;
     format date WEEKDATX17.;
run;
proc print;
run;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 12h32   #3
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Je ne connais pas tout le contexte de ton probleme, mais pourquoi necessairement un format? Une simple boucle en mode macro pourrait egalement faire l'affaire...
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 14h47   #4
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
Citation:
Envoyé par StéphanieB. Voir le message
J'aimerais reprendre ce code pour extraire les 52 dernières périodes, maintenant mon format d'entrée étant 201113 : 13ème semaine de l'année 2011.

Y'a-t-il un format pour cela?

Comment créer à partir de rien un format? et comment l'utiliser?

Merci de votre aide !
bonjour

ce n'est pas un format dont tu as besoin mais un informat. le second argument de la fonction INPUT est en effet un informat et demande la lecture de la modalité 201101 au moyen de cet informat pour la transformer en une date qui pourra ensuite être manipulée par la fonction INTNX.

tu peux appeler la variable qui contient 201101 date mais ce n'est pas une date aux yeux de SAS (une date, pour SAS, c'est un nombre de jours depuis le 1er janvier 1960).

il n'y a vraiment pas de vraies dates dans ta table ?

a+

Sébastien Ringuedé
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 17h23   #5
Nouveau Membre du Club
 
Inscription : juillet 2009
Messages : 74
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juillet 2009
Messages : 74
Points : 27
Points : 27
J'ai voulu tricher en reprenant le code existant, mais je me rends compte que quand j'arrive à par exemple 201112, ça me renvoie 201001...
Finalement on va faire une nouvelle table en base et calculer les périodes nécessaires avec la partie etl (en datastage).

En revanche j'ai un autre souci :
Prenons toujours le même exemple : 201126 (26ème semaine de l'année 2011)
Considérons que le premier jour de la semaine est un lundi et le dernier jour de la semaine le vendredi.
Comment obtenir à partir de 201126 : du 27/06 au 01/07 ?

J'ai pensé à faire une fonction qui dirait que 201101 est du 03/01 au 07/01 mais cela pose problème en fin de mois...
Et si j'ai un historique de 10 ans cela va être encore plus gênant...
Je pourrais aussi faire un tableau avec 52 lignes par an, mais avec 10 ans d'historique et les évolutions dans le temps cela ne me paraît pas envisageable...

Comment obtenir à partir de ce format année-semaine, le premier et le dernier jour de cette semaine de cette année ?
StéphanieB. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 17h27   #6
Nouveau Membre du Club
 
Inscription : juillet 2009
Messages : 74
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juillet 2009
Messages : 74
Points : 27
Points : 27
Citation:
Envoyé par z6c3po Voir le message
bonjour
il n'y a vraiment pas de vraies dates dans ta table ?
Malheureusement non... notre date est année-semaine, un format difficilement manipulable dans tous les sens.

à partir de cette date il va falloir S-1, S-4, S-12 et S-52, retrouver le mois auquel ça correspond, ...
Nous allons essayer de faire ces calculs en amont.
StéphanieB. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 18h15   #7
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
Citation:
Envoyé par StéphanieB. Voir le message
J'ai voulu tricher en reprenant le code existant, mais je me rends compte que quand j'arrive à par exemple 201112, ça me renvoie 201001...
Finalement on va faire une nouvelle table en base et calculer les périodes nécessaires avec la partie etl (en datastage).

En revanche j'ai un autre souci :
Prenons toujours le même exemple : 201126 (26ème semaine de l'année 2011)
Considérons que le premier jour de la semaine est un lundi et le dernier jour de la semaine le vendredi.
Comment obtenir à partir de 201126 : du 27/06 au 01/07 ?

J'ai pensé à faire une fonction qui dirait que 201101 est du 03/01 au 07/01 mais cela pose problème en fin de mois...
Et si j'ai un historique de 10 ans cela va être encore plus gênant...
Je pourrais aussi faire un tableau avec 52 lignes par an, mais avec 10 ans d'historique et les évolutions dans le temps cela ne me paraît pas envisageable...

Comment obtenir à partir de ce format année-semaine, le premier et le dernier jour de cette semaine de cette année ?
c'est jouable (parce qu'avec SAS, rien n'est impossible et comme ça a l'air amusant...)

la semaine du 27/06 (lundi dernier) - 01/07 (demain) c'est votre semaine 26 ?
vous avec des semaines 0 dans certaines années ?
des semaines 53 ? quelles années ?

a+

Sébastien Ringuedé
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 18h21   #8
Nouveau Membre du Club
 
Inscription : juillet 2009
Messages : 74
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : juillet 2009
Messages : 74
Points : 27
Points : 27
A priori, il n'y aura pas de semaine zéro.
En revanche, oui certainement il y aura des semaines 53.

Nous n'avons pas encore de fichiers sources, on commence les développements avec les documents de conception. C'est moche, je sais...

Citation:
la semaine du 27/06 (lundi dernier) - 01/07 (demain) c'est votre semaine 26 ?
oui, c'est cela. Cela me semble un bon exemple puisque c'est une semaine à cheval sur 2 mois.

Il y aura un historique de 10 ans, et il faudra aussi prendre en compte les années à venir. Donc prise en compte des années bisextiles. Je vais bien m'amuser pour me faire la main avec SAS !
StéphanieB. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 18h22   #9
Nouveau Membre du Club
 
Homme Gaëtan
Inscription : avril 2011
Messages : 29
Détails du profil
Informations personnelles :
Nom : Homme Gaëtan
Localisation : France

Informations forums :
Inscription : avril 2011
Messages : 29
Points : 26
Points : 26
Sinon en SAS il y a un format pour ça.

En fait il y en a 3 :
WEEKU
WEEKV
WEEKW

La différence entre ces 3 formats c'est le choix du premier jour de la semaine, ce qui peut modifier le numéro de la semaine.
boutchiwah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 18h26   #10
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
hello,
un petit tour dans la FAC SAS tu trouvera une piste.
Maintenant il faut faire l'opération inverse et récupérer la date du numéro de la semaine.
Bon courage.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 18h35   #11
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
Citation:
Envoyé par boutchiwah Voir le message
Sinon en SAS il y a un format pour ça.

En fait il y en a 3 :
WEEKU
WEEKV
WEEKW

La différence entre ces 3 formats c'est le choix du premier jour de la semaine, ce qui peut modifier le numéro de la semaine.
mais les FORMATS que tu cites ne peuvent pas aider ici puisqu'il faut les appliquer à des dates SAS (des nombres de jours depuis le 1/1/1960).

Les informats WEEKU, WEEKV et WEEKW sont par contre à explorer sauf que pour l'instant, il n'y a pas de W entre l'année et la semaine... ça peut s'arranger...

par contre, ces informats peuvent comprendre 03W01, pas 2003W01...

a+
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 18h40   #12
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
Citation:
Envoyé par s_a_m Voir le message
hello,
un petit tour dans la FAC SAS tu trouvera une piste.
Maintenant il faut faire l'opération inverse et récupérer la date du numéro de la semaine.
Bon courage.
il existe une fonction WEEK non citée dans ce faq pour calculer le numéro d'une semaine en fonction de différentes normes

a+

Sébastien Ringuedé
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 18h49   #13
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Bonjour.
Ce que je te propose : récupère d'abord dans 2 variables l'année et le n° de semaine. Ensuite reconstruis des dates SAS classiques (en nb de jours depuis 1960) avec la fonction INTNX qui ajoute des intervalles de temps à une date. Le point de départ est le 1er janvier de l'année, le nombre d'intervalles à ajouter le n° de semaine, l'intervalle de temps est WEEK.2 (les semaines commençant le lundi).
En détail ça donne ceci
Code :
1
2
3
4
5
6
7
8
9
DATA work.test1 ;
  en_num = 201126 ;
  annee = FLOOR(en_num/100) ;
  semaine = MOD(en_num,100) ;
  janv1er = MDY(1,1,annee) ;
  debut_semaine = INTNX("WEEK.2",janv1er,semaine) ;
  fin_semaine = debut_semaine + 4 ; /* --> vendredi */
  FORMAT debut_semaine fin_semaine DDMMYY10. ;
RUN ;
Si la date initiale est en texte, faire des SUBSTR au lieu de FLOOR et MOD.
Bon courage.
Olivier

PS : une fois le début de semaine créé en tant que date, c'est plus facile de reculer d'une semaine, de 10, etc. avec INTNX ou tout simplement en soustrayant 7 jours ou 70 pour 10 semaines.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 19h51   #14
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
et bien avant l'apéro, j'étais sur la construction d'un INFORMAT spécifique...

mais y'a un os...

début du programme :
Code :
1
2
3
4
5
6
7
8
9
10
 
PROC FORMAT ;
picture temp low-high='%Y%0W' (DATATYPE=date);
run;
 
DATA test;
x="12mar2012"d;
format x temp.;run;
 
proc print;run;
avant de créer un INFORMAT, il faut déjà créer un FORMAT...

et bien là, il y a un os puisque %W (%U et %V sont aussi possibles...) est supposé me donner un numéro de semaine... et il ne s'affiche pas...

je regarderai cela demain... (si j'ai le temps..)

a+

Sébastien Ringuedé
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 10h35   #15
Nouveau Membre du Club
 
Homme Gaëtan
Inscription : avril 2011
Messages : 29
Détails du profil
Informations personnelles :
Nom : Homme Gaëtan
Localisation : France

Informations forums :
Inscription : avril 2011
Messages : 29
Points : 26
Points : 26
en utilisant l'informat weekv qui correspond aux semaines française, on peut faire comme ça :

Pour une année-mois en caractères :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
DATA date;
informat date_ini $6.;
input date_ini ;
cards;
201001
201003
201009
201012
201020
201043
201052
201053
;
run;
 
DATA fin;
SET date;
annee = substr(date_ini,1,4);
semaine = substr(date_ini,5);
date_modif = compress(annee!!'W'!!semaine);
debut_semaine=input(date_modif,weekv9.);
fin_semaine=debut_semaine+4.;
format debut_semaine ddmmyy8. fin_semaine ddmmyy8.;
/*drop annee semaine date_modif date_ini;*/
run;

et sinon pour une année-mois en numériques :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
DATA date2;
informat date_ini 6.;
input date_ini ;
cards;
201001
201003
201009
201012
201020
201043
201052
201053
;
run;
 
DATA fin2;
SET date;
annee = FLOOR(date_ini/100);
IF length(compress(MOD(date_ini,100))) < 2 then semaine='0'!!MOD(date_ini,100);
else semaine = MOD(date_ini,100);
date_modif=compress(annee!!'W'!!semaine);
debut_semaine=input(date_modif,weekv9.);
fin_semaine=debut_semaine+4.;
format debut_semaine ddmmyy8. fin_semaine ddmmyy8.;
/*drop annee semaine date_modif date_ini;*/
run;
boutchiwah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 11h23   #16
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
de mon coté, je n'ai pas avancé... parce qu'il y a vraiment un truc étrange...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
PROC FORMAT ;
picture blika low-high='%Y/%b/%d/%W/%w/%U/%V/' (DATATYPE=date);
run;
 
DATA test;
x="12apr2012"d;
format x blika25.;
run;
 
proc print;run;
 
Obs    x
 
 1           2012/avr/12//5/15//
%W et %V doivent donner des numéros de semaine et ne donnent rien...

on en parle en fait ici :
http://communities.sas.com/message/54460#54460

c'est documenté mais ça n'existe pas...

maintenant, comme des solutions ont été proposées...

a+

Sébastien Ringuedé
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h43.


 
 
 
 
Partenaires

Hébergement Web