IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS Base Discussion :

Problème de format, recherche format année-semaine


Sujet :

SAS Base

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 86
    Points : 68
    Points
    68
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 1 625
    Points : 3 403
    Points
    3 403
    Par défaut
    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 : 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
    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;

  3. #3
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    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...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    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é

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 86
    Points : 68
    Points
    68
    Par défaut
    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 ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 86
    Points : 68
    Points
    68
    Par défaut
    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.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    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é

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 86
    Points : 68
    Points
    68
    Par défaut
    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...

    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 !

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 29
    Points : 32
    Points
    32
    Par défaut
    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.

  10. #10
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 1 625
    Points : 3 403
    Points
    3 403
    Par défaut
    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.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    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+

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    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é

  13. #13
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 29
    Points : 32
    Points
    32
    Par défaut
    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 : 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
    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 : 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
    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;

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 133
    Points : 371
    Points
    371
    Par défaut
    de mon coté, je n'ai pas avancé... parce qu'il y a vraiment un truc étrange...

    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
     
    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é

Discussions similaires

  1. [MySQL] Recherche format Date sans prendre en compte Année
    Par bouuuh dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/07/2014, 15h11
  2. [FORMATION] recherche formation python & postgresql
    Par Maître Kenobi dans le forum Autres
    Réponses: 0
    Dernier message: 08/11/2012, 10h05
  3. Réponses: 4
    Dernier message: 19/04/2007, 01h33
  4. Réponses: 8
    Dernier message: 29/09/2006, 18h09
  5. [format] recherche format dbf
    Par cibouseb dans le forum Autres SGBD
    Réponses: 8
    Dernier message: 03/05/2006, 11h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo