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 13/04/2011, 10h16   #1
Invité régulier
 
Inscription : juillet 2008
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 58
Points : 7
Points : 7
Par défaut Format year4. : faire une table par année

Bonjour,

J'ai une variable année au format year4. , j'aimerai faire une table par année donc je fais une étape data:

Code :
1
2
3
4
DATA table2;
SET table1;
IF annee="2011" then output;
run;
Le problème est que la table2 est vide, alors qu'il y a bien la modalité 2011 dans la variable annee de la table1.
Cela vient sans doute du format, comment régler ce problème?

merci!
ludo35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 10h24   #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
les dates sas sont de type numériques et non pas caractères.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 10h27   #3
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Hello,

Es-tu sûr que ta variable annee est stockée au format year4. ?

Je viens de tester le code suivant:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DATA one;
	format annee year4.;
	annee = 2010;
	output;
	annee = 2011;
	output;
	annee = 2012;
	output;
run;
 
DATA two;
	SET one;
	IF annee = 2011 then
		output;
run;
et ça fonctionne.

Lorsque tu mets des guillemets, SAS convertit en numérique (Regarde ton log).
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
63   DATA two;
64       SET one;
65       IF annee = "2011" then
66           output;
67   run;
 
NOTE: Character VALUES have been converted TO numeric VALUES at the places given BY:
      (Line):(COLUMN).
      65:16
NOTE: There were 3 observations READ FROM the DATA SET WORK.ONE.
NOTE: The DATA SET WORK.TWO has 1 observations AND 1 VARIABLES.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds
Les dates sont effectivemment stockées en numérique, les guillemets sont donc obsolètes.
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 10h27   #4
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
tu peux faire ceci ?
Code :
1
2
3
4
 
proc sql;
     DESCRIBE TABLE table1;
quit ;
et voir dans la log si ta variable est numérique ou caractère
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 10h29   #5
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
Retrouves le format associé à tes années (je prends comme postulat que ta variable année est formatée, c'est bien ca?).

exemple
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
28
29
 
proc format;
value anneef	
1="2010" 
2="2011" 
3="2012"
;
run;
quit;
 
DATA donnees;
input annee ;
format annee anneef.;
cards;
1
2
3
2
1
2
;
run;
 
DATA  annee1 annee2 annee3;
SET donnees; 
IF annee=1 then output annee1;
IF annee=2 then output annee2;
IF annee=3 then output annee3;
run;
Pour retrouver le format, tu peux t'aider du viewtable, en double cliquant sur la colonne.

Dans ma dernière étape data je crée trois table sorties directement suivant la valeur de annee.

Bon courage,

Manoutz
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 12h16   #6
Invité régulier
 
Inscription : juillet 2008
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 58
Points : 7
Points : 7
Lorsque je teste ton code L0007 :

Code :
1
2
3
4
5
6
7
8
9
DATA one;
	format annee year4.;
	annee = 2010;
	output;
	annee = 2011;
	output;
	annee = 2012;
	output;
run;
J'obtient une table contenant :
1965
1965
1965

c'est normal ?
ludo35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 12h52   #7
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
oui c'est normal. à cause du format year ( supprime le format et tu verra que l'affichage est normal).
je t'ai dis que les dates SAS sont numériques et elles sont le nombre de jours depuis le 01 janvier 1960.
alors SAS comprends que 2011, 2011 est un nombre de jour.
Code :
1
2
3
4
5
6
 
 
DATA test;
a=2010;	  /*ici c'est numérique = un nombre de jour*/
b=put(a, year4.);
run;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 13h56   #8
Invité régulier
 
Inscription : juillet 2008
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 58
Points : 7
Points : 7
oui je vois, mais ducoup comment je fais pour avoir mes tables de chaque année? Car ma variable à la base est une variable date, que j'ai mis en year4. pour essayer de faire un if annee=2010 then output : ce qui ne marche pas.

Le format d'origine de la variable est DATETIME20. et elle contient par exemple "26/11/2008 10:39:17".
Comment puis-je faire alors pour avoir une table par année?

Merci!
ludo35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 13h59   #9
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Tu peux mettre en pièce jointe un échantillon de ton fichier? avec au moins deux années si possible.
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 13h59   #10
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
il faut convertir ton datetime en year
annee=year(datepart(var_format_date_time));

datetime extrait l'année, mois, jours d'une variable datetime
year extrait l'année d'une variable date (mois/jours/année)
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 14h07   #11
Invité régulier
 
Inscription : juillet 2008
Messages : 58
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 58
Points : 7
Points : 7
ta solution marche bahraoui !

merci à vous tous!
ludo35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 14h14   #12
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
+1 Bahraoui, il faut utiliser la fonction year.


Pour expliquer un peu plus: Les dates en sas sont de type numérique, c'est un nombre. Lorsque tu fais comprendre à sas que la variable numérique est une date, il va prendre comme date de référence le premier janvier 1960.

1=1 janv 1960
2=2 janv 1960
...

Code :
1
2
3
4
5
6
7
DATA test;
do day= 1 TO 2012;
year=year(day);
output;
end;
format day ddmmyy10.;
run;
Le nombre 2012 est donc dans l'année 1965.

si tu vaux attribuer un nombre sas à partir d'une année, utilises la fonction mdy - pour month day year, avec la syntaxe:
Code :
nvelledate=mdy(1,1,year);
tu placeras la date sas au premier janvier de l'année de ta variable année
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 14h29   #13
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Citation:
Envoyé par ludo35 Voir le message
ta solution marche bahraoui !

merci à vous tous!
Si jamais tu veux automatiser la génération des tables pour chaque année (s'il y en a plusieurs) tu demandes, ok? Tu sais bien que le client est roi

Beau gosse Barahoui
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h20.


 
 
 
 
Partenaires

Hébergement Web