2017-04-07 10 views
0

J'ai un jeu de données avec une variable, date de début, qui prend beaucoup de valeurs différentes en utilisant un format de caractères.Mise en forme de date SAS

J'ai divisé l'ensemble de données en utilisant les valeurs de la colonne date de début, parce que je veux transformer la variable de date en deux nouvelles colonnes avec deux valeurs de date différents:

if length(Startvalue) = 6 then output a6; 
else if length(Startvalue) = 8 then output a8 ; 
else if length(Startvalue) = 1 then output a1; 
else output a_other; 

Une valeur est écrite comme celui-ci : 090209 (DDMMYY)

Je veux mettre en forme la variable dans une date9. format et un DDMMYYD10. format comme ceci:

FORMAT Startvalue2 date9.; 
format Startvalue3 DDMMYYD10.; 

je l'ai eu à travailler avec cette approche dans une étape de données:

FORMAT Startdato2 date9.; 
format startdato3 DDMMYYD10.; 
Startdato2 = INPUT(PUT(Startdato,6.),DDMMYY6.); 
Startdato3 = INPUT(PUT(Startdato,6.),DDMMYY6.); 

Une autre valeur est écrite comme ceci: 15-08-17 (JJ-MM-AA) Je veux aussi les deux formats sur cette valeur, comme celui-ci:

FORMAT Startvalue2 date9.; 
format Startvalue3 DDMMYYD10.; 

Mais ici, je ne peux pas utiliser une copie de mon expression en haut:

FORMAT Startvalue2 date9.; 
format Startvalue3 DDMMYYD10.; 
Startvalue2 = INPUT(PUT(Startvalue,8.),DDMMYYDw.); 
Startvalue3= INPUT(PUT(Startvalue,8.),DDMMYYDw.); 

Savez-vous pourquoi? Et comment je peux obtenir la valeur transformée en une date9. format et un format DDMMYYD10?

Amitiés

Maria

Répondre

1

Vous n'avez pas besoin de convertir les valeurs numériques avec une instruction put lorsque vous utilisez input. Le but de input est de prendre une entrée de caractère et de la transformer en une valeur numérique pour que SAS puisse faire des calculs. Comment je me souviens toujours:

  • Dans put: Convertir un en valeur mis en à une valeur numérique
  • Mettez: Out mis une valeur numérique en tant que valeur de caractère

Une solution plus simple que vous pouvez essayer est d'utiliser le anydtdte. informat.Il est capable de lire toutes les informats suivantes:

  • Date de
  • Datetime
  • DDMMYY
  • JULIAN
  • MDYAMPM
  • MMJJAA
  • MMxYY
  • MONYY
  • TEMPS
  • YMDDTTM
  • YYMMDD
  • YYQ
  • YYxMM
  • Mois, Jour, Année

Par exemple:

%let default_datestyle = %sysfunc(getoption(datestyle)); 

options datestyle=DMY; 

data want; 
    set have; 

    Startdato2 = INPUT(Startdato, anydtdte.); 
    Startvalue2 = INPUT(Startvalue, anydtdte.); 

    Startdato3 = Startdato2; 
    Startvalue3 = Startvalue2; 

    <rest of code>; 

    format Startvalue2 date9. 
      Startvalue3 ddmmyyd10. 
      Startdato2 date9. 
      Startdato3 ddmmyyd10. 
    ; 
run; 

options datestyle = &default_datestyle; 

donner cette informat essayer et voir si elle est en mesure pour tout avoir. Sinon, vous pouvez tenir compte de ces cas spéciaux avec une certaine logique conditionnelle.

+0

Merci pour la réponse. Si j'utilise cette méthode sur la valeur 21-09-17 j'obtiens cette sortie: 17SEP2021 \t 17-09-2021 Ce n'est pas ce que je veux. Il doit être: 21SEP2017 et 21-09-2017 – user1626092

+0

De l'anydtdte. documentation: "Il est possible que les données d'entrée telles que 01-02-03 ou 01-02 soient ambiguës en ce qui concerne le mois, le jour et l'année, dans ce cas, l'option du système DATESTYLE indique l'ordre du mois, du jour et année. " J'ai mis à jour le code pour refléter cela. –

+0

Yay, ça marche! Merci beaucoup - pas sûr que je comprends le code ajouté, mais j'accepte - et je suis heureux :) – user1626092