在SAS中无法正确读取日期和时间字符串

时间:2012-11-30 20:09:49

标签: date sas informat

我有以下示例数据可以读入SAS

2012-05-0317:36:00NYA
2012-05-0410:29:00SNW
2012-05-2418:45:00NYA
2012-05-2922:24:00NSL
2012-05-3107:26:00DEN
2012-05-2606:10:00PHX
2012-05-0202:30:00FTW
2012-05-0220:45:00HOB
2012-05-0103:01:00HGR
2012-05-0120:30:00RCH
2012-05-1112:00:00NAS

但是,有一个奇怪的问题困扰着我。 这是我的第一次尝试。

data test;
    informat DT yymmdd10.
        TM $TIME8.
        orig $3.
    ;
    format DT yymmddd10.
        TM TIME8.
        orig $3.
    ;
    input
        @1 DT_temp 
        @11 TM_temp 
        @19 orig 
    ;
    datalines;
2012-05-0317:36:00NYA
2012-05-0410:29:00SNW
2012-05-2418:45:00NYA
2012-05-2922:24:00NSL
2012-05-3107:26:00DEN
2012-05-2606:10:00PHX
2012-05-0202:30:00FTW
2012-05-0220:45:00HOB
2012-05-0103:01:00HGR
2012-05-0120:30:00RCH
2012-05-1112:00:00NAS
run;

结果显示

DT TM orig
.   .   NYA
.   .   SNW
.   .   NYA
.   .   NSL
.   .   DEN
.   .   PHX
.   .   FTW
.   .   HOB
.   .   HGR
.   .   RCH
.   .   NAS

这意味着无法正确读取日期和时间。我现在的解决方法是先将所有内容作为字符串读取,然后分别将其转换为日期和时间。

data test;
    informat DT_temp $10.
        TM_temp $8.
        orig $3.
    ;
    format DT yymmddd10.
        TM TIME8.
        orig $3.
    ;
    input
        @1 DT_temp 
        @11 TM_temp 
        @19 orig 
    ;
    DT=input(strip(DT_temp),yymmdd10.);
    TM=input(strip(TM_temp),time8.);

    drop DT_temp TM_temp;
    datalines;
2012-05-0317:36:00NYA
2012-05-0410:29:00SNW
2012-05-2418:45:00NYA
2012-05-2922:24:00NSL
2012-05-3107:26:00DEN
2012-05-2606:10:00PHX
2012-05-0202:30:00FTW
2012-05-0220:45:00HOB
2012-05-0103:01:00HGR
2012-05-0120:30:00RCH
2012-05-1112:00:00NAS
run;

通过这种方式,一切都得到了正确的格式。

orig DT TM
NYA 2012-05-03  17:36:00
SNW 2012-05-04  10:29:00
NYA 2012-05-24  18:45:00
NSL 2012-05-29  22:24:00
DEN 2012-05-31  7:26:00
PHX 2012-05-26  6:10:00
FTW 2012-05-02  2:30:00
HOB 2012-05-02  20:45:00
HGR 2012-05-01  3:01:00
RCH 2012-05-01  20:30:00
NAS 2012-05-11  12:00:00

基本上,这两种方法使用相同的信息。我想知道为什么第一种方法不起作用。感谢任何形式的帮助。非常感谢你。

1 个答案:

答案 0 :(得分:2)

你的“第一次尝试”代码有几个错误,但我猜他们是在写这个问题的时候介绍的。

因为您使用的是面向列的input,所以需要指定要用于每个变量的格式。这是一个更正版本:

data test;
    informat DT yymmdd10.
        TM TIME8.
        orig $3.
    ;
    format DT yymmddd10.
        TM TIME8.
        orig $3.
    ;
    input
        @1 DT  yymmdd10.
       @11 TM  TIME8.
       @19 orig $3.
    ;
    datalines;
2012-05-0317:36:00NYA
2012-05-0410:29:00SNW
2012-05-2418:45:00NYA
2012-05-2922:24:00NSL
2012-05-3107:26:00DEN
2012-05-2606:10:00PHX
2012-05-0202:30:00FTW
2012-05-0220:45:00HOB
2012-05-0103:01:00HGR
2012-05-0120:30:00RCH
2012-05-1112:00:00NAS
run;