将mm / dd / yy转换为SAS中的MonthName DayNumber,YearNumber

时间:2017-07-26 01:06:04

标签: sas

我希望能够以这种方式转换整个日期列。例如,2017年1月1日至2017年1月1日。我意识到有一种令人费解的方式做到这一点,但我不完全确定我将如何接近逻辑。此外,是否有一种SAS格式可以做到这一点?感谢。

2 个答案:

答案 0 :(得分:0)

确实可以使用您可以使用的格式。这是一个使用测试数据的工作示例:

data test;
  input datestring $;
  datalines;
  01/01/2017
;
run;

使用输入将字符串值转换为SAS日期,然后使用put函数创建一个包含您要查找的表示的字符变量:

data test2;
  set test;
  date_as_date = input(datestring,ddmmyy10.);
  date_formatted = put(date_as_date,worddate20.);
run;

数字20用于描述足够长以保持完整值的长度,使用较小的数字可能会导致截断,例如

date_formatted = put(date_as_date,worddate3.);
put date_formatted=;

dateformatted=Jan

答案 1 :(得分:0)

在某些情况下,可能不存在所需的日期格式(在这种情况下,它确实是' worddate20。'),但作为示例......

您可以编写一个函数式宏来将SAS日期转换为" monname + day,year"格式,例如

%MACRO FULLMDY(DT) ;
  catx(', ',catx(' ',put(&DT,monname.),put(&DT,day.)),put(&DT,year4.))
%MEND ;

data example1 ;
  dt = '26jul2017'd ;
  fulldate = %FULLMDY(dt) ;
run ;

或者,您可以构建自定义格式,涵盖数据中可能存在的所有日期,例如

data alldates ;
  retain fmtname 'FULLMDY' type 'N' ;
  do dt = '01jan1900'd to '01jan2100'd ;
    mdy = catx(', ',catx(' ',put(dt,monname.),put(dt,day.)),put(dt,year4.)) ;
    output ;
  end ;

  rename dt = start
         mdy = label ;
run ;
proc format cntlin=alldates ; run ;

data example2 ;
  dt = '26jul2017'd ;
  format dt fullmdy. ;
run ;