sas informat datetime

时间:2009-09-07 13:56:20

标签: datetime sas informat

任何人都可以建议在相应的SAS信息中读取日期时间(dd / mm / yyyy hh:mm)???

例如

data _null_;
informat from_dt datetime????.;
input from_dt ;
put from_dt=;
cards;
01/01/1960 00:00
;run;

5 个答案:

答案 0 :(得分:8)

我不认为特定的信息是内置的,但滚动你自己相对容易。下面是创建自定义日期时间信息(这需要一个cntlin数据集)和一个自定义格式(使用图片语句)的示例,该格式读取您的特定日期时间,然后将其格式化为与输入相同。我通过假设时间部分总是午夜(00:00)来简化它,但是如果你需要跟踪时间部分它也可以很容易地扩展(只需将86400数字更改为3600以获得每小时,和60每分钟)。如果打开work.infmt数据集以查看它的外观,将有助于查看正在发生的情况。

/* Create a custom datetime format as Month/Day/Year<space>Hours:Minutes*/
proc format;
  picture mydt other='%0m/%0d/%0Y %0H:%0M' (datatype=datetime);
run;

/* Create a custom informat using the format above */
data infmt ;
retain fmtname "dtwithspace" type "I" ;
   do label = "1jan1960:00:00"dt to
              "2jan2059:00:00"dt by 86400 ; 
      start = trim(left(put(label,mydt.)));
      output ;
   end ;
run ;
proc format cntlin = infmt ;
run ;


/* Now apply the informat and format to the data */
data _null_;
input from_dt $ 1-20;
format from_dt2 mydt.;
from_dt2=input(from_dt, dtwithspace.);
put from_dt2=;
cards;
01/01/1960 00:00
01/02/1999 00:00
;
run;

这给出了这样的输出:

278  data _null_;
279  input from_dt $ 1-20;
280  format from_dt2 mydt.;
281  from_dt2=input(from_dt, dtwithspace.);
282  put from_dt2=;
283  cards;

from_dt2=01/01/1960 00:00
from_dt2=01/02/1999 00:00

答案 1 :(得分:8)

anydt *系列的信息通常都有用。

data _null_;
  from_dt = input("01/01/1960 00:00", anydtdtm.);
  put from_dt= :datetime20.;
run;
/* on log
from_dt=01JAN1960:00:00:00
*/

答案 2 :(得分:5)

SAS可能不支持您的数据所在的特定日期时间格式。您可以尝试将传入数据转换为frendlier格式,也可以使用substrDHMS and MDY函数解析日期时间:

data test;
    format dtstr $16. dt datetime22.4;
    dtstr='01/01/1960 00:00';
    day=substr(dtstr,1,2);
    month=substr(dtstr,4,2);
    year=substr(dtstr,7,4);
    hour=substr(dtstr,11,2);
    minute=substr(dtstr,15,2);
    dt=DHMS(MDY(1*month,1*day,1*year),1*hour,1*minute,0);
    output;
run;

或者您可以将datetime字符串转换为datetimew.d格式并输入格式化字符串:

data test;
    format dtstr $16. dstr $8. tstr $5. indtstr $14. dt datetime22.4;
    dtstr='01/01/1960 00:00';
    dstr=put(input(substr(dtstr,1,10),mmddyy10.),date8.);
    tstr=substr(dtstr,12);
    indtstr=dstr!!':'!!tstr;
    dt=input(indtstr,datetime14.0);
    output;
run;

转换可以压缩为单个但复杂的语句,因此为此创建宏可能是一个很好的决定。

答案 3 :(得分:0)

来自This entry

SAS knowledgebase包含用于解析和格式化日期时间的代码。看起来SAS有一个很棒的在线帮助系统。

this exchange on Google groups中的第三条消息也可能有用。它讨论了输入日期时间,并提供代码。

你的问题很难破译,我对SAS知之甚少,这就是我所能提供的一切。希望它有所帮助。

答案 4 :(得分:0)

按照here列表,我认为没有。

可以想象,您可以使用proc format创建自己的自己,但我认为这将非常困难。 Ville Koskinen的建议可能是你最好的选择。