2017-04-07 165 views
0

我有一个变量数据集,开始日期,它使用字符格式需要很多不同的值。SAS日期格式

我已经分手了使用起始日期列中的值,因为我想日期变量转换成两列,与两个不同的日期值数据集:

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; 

价值之一是这样写的:090209(DDMMYY)

我想将变量格式化为date9。格式和DDMMYYD10。类似这样的格式:

FORMAT Startvalue2 date9.; 
format Startvalue3 DDMMYYD10.; 

我得到了它的这种方法在数据步工作:

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

另一个价值是这样写的:15-08-17(DD-MM-YY) 我也希望这两种格式该值,如:

FORMAT Startvalue2 date9.; 
format Startvalue3 DDMMYYD10.; 

但在这里我不能从上面用我表达的副本:

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

你知道为什么吗?我怎样才能将价值转化为一个日期9。格式和DDMMYYD10格式?

亲切的问候

玛丽亚

回答

1

你不需要转换的值与put语句数字当您使用inputinput的目标是采取一个字符输入,并将其转化为SAS与数学计算的数值。我如何永远记住它:

  • 放:在转换一个在看跌为数值
  • :出数值作为字符值

您可以尝试的更简单的解决方案是使用anydtdte. informat。它能够读取任何下列informats:

  • 日期
  • 日期时间
  • DDMMYY
  • JULIAN
  • MDYAMPM
  • MMDDYY
  • MMxYY
  • MONYY
  • TIME
  • YMDDTTM
  • YYMMDD
  • YYQ
  • YYxMM
  • 月,日,年

例如:

%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; 

给该资料,请一个尝试,看看它是否能够获得一切。如果不是,你可以用一些条件逻辑来解释这些特殊情况。

+0

感谢您的回答。如果我在值21-09-17上使用这种方法,我得到这个输出: 17SEP2021 \t 17-09-2021 这不是我想要的。它需要是:21SEP2017和21-09-2017 – user1626092

+0

从anydtdte。文档:“01-02-03或01-02等输入数据可能在月份,日期和年份不明确,在这种情况下,DATESTYLE系统选项会指示月份,日期,和一年。“我更新了代码以反映这一点。 –

+0

耶,它的作品!非常感谢 - 不知道我了解添加的代码,但我接受 - 而且我很高兴:) – user1626092