在SAS中将字符转换为日期时间有什么问题?

时间:2018-12-14 03:22:28

标签: sas

美好的一天。在Base SAS中,我尝试将字符转换为日期时间格式。字符来自宏变量。我尝试将其转换,但失败了。 抱怨格式无效$ DATETIME表示我的转换失败。 现在我迷路了。

我遇到此错误:

MPRINT(ALFRED):   data _null_;
MPRINT(ALFRED):   set ncpdm.ncp_load_tnbt_201811 (obs=1);
MPRINT(ALFRED):   where st_datetime ^= . and sp_datetime ^= .;
MPRINT(ALFRED):   call symputx("sp_datetime",sp_datetime);
MPRINT(ALFRED):   run;

NOTE: There were 1 observations read from the data set NCPDM.NCP_LOAD_TNBT_201811.
      WHERE (st_datetime not = .) and (sp_datetime not = .);
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.01 seconds


1858869000
MPRINT(ALFRED):   data linkbacktoretnbt;
MPRINT(ALFRED):   set linkbacktore;
NOTE 137-205: Line generated by the invoked macro "ALFRED".
5801          data linkbacktoretnbt; set linkbacktore; SystemPeakDate2=&sp_datetime; SystemPeakDate=input(SystemPeakDate2,best32.); format SystemPeakDate datetime.; format data_dttm datetime.; run;   data ncp_load_re; set ncpdm.ncp_load_re; run;  proc sql
;
                                                                                                                                                          _________
                                                                                                                                                          48
5801     !  create
ERROR 48-59: The format $DATETIME was not found or could not be loaded.

MPRINT(ALFRED):   SystemPeakDate2=1858869000;
MPRINT(ALFRED):   SystemPeakDate=input(SystemPeakDate2,best32.);
MPRINT(ALFRED):   format SystemPeakDate datetime.;
MPRINT(ALFRED):   format data_dttm datetime.;
MPRINT(ALFRED):   run;

我的代码:

    %macro alfred();

* Get system peak;
%let sp_datetime=;
data _null_;
    set ncpdm.ncp_load_tnbt_&Period (obs=1);
    where st_datetime ^= . and sp_datetime ^= .;
    call symputx("sp_datetime",sp_datetime);
run;
%put &sp_datetime;

proc sql;
create table linkbacktore as
select a.*,
b.max_power
from /*ncpdm.ncp_load_re*/ distinctfulljoin /*REsourceFULLSCADA2*/ a
left join groupedscadappu b
on a.re_ca_no=b.re_ca_no
and a.re_switch_no=b.re_switch_no;
run;

* Get system peak from TNBT Metering;
%let sp_datetime=;
data _null_;
    set ncpdm.ncp_load_tnbt_&Period (obs=1);
    where st_datetime ^= . and sp_datetime ^= .;
    call symputx("sp_datetime",sp_datetime);
run;
%put &sp_datetime;


data linkbacktoretnbt;
set linkbacktore;
SystemPeakDate2=&sp_datetime;
SystemPeakDate=input(SystemPeakDate2,best32.);
format SystemPeakDate datetime.;
format data_dttm datetime.;
run;


%mend;
%alfred;

怎么了?

2 个答案:

答案 0 :(得分:0)

您得到的错误是因为您试图将数字格式与字符变量相关联。

1    data _null_;
2       length SystemPeakDate $32.;
3       format SystemPeakDate datetime.;
                              ---------
                              48
ERROR 48-59: The format $DATETIME was not found or could not be loaded.

4       run;

在数据步骤中,您可以省略$符号,SAS将提供它。考虑这个例子。

51   data _null_;
52      x = 'xyz';
53      format x 2.;
54      f = vformat(x);
55      put x= f=;
56      run;

x=xy f=$CHAR2.

答案 1 :(得分:0)

错误消息指出出了什么问题。您正在尝试将数字格式附加到字符变量。因此,SAS会尝试提供帮助,并假定您只是忘记在格式名称上加上$前缀。但是随后它找不到名为$DATETIME的字符格式。因此出现错误消息。

从输入数据集中获取的变量SystemPeakDate看起来像是字符变量?

您为什么还要执行这两个步骤?

SystemPeakDate2=&sp_datetime;
SystemPeakDate=input(SystemPeakDate2,best32.);

您正在创建SystemPeakDate2作为数字变量开头。在日志中查看MPRINT行。

MPRINT(ALFRED):   SystemPeakDate2=1858869000;
MPRINT(ALFRED):   SystemPeakDate=input(SystemPeakDate2,best32.);

您尝试使用INPUT()函数将其转换为数字只是迫使SAS首先将其转换为字符串,以便INPUT()函数具有要读取的字符串。

如果要将SystemPeakDate从字符转换为数字,请使用INPUT()函数和可生成数字值的信息格式。所以也许您想要类似的东西:

SystemPeakDate2=input(SystemPeakDate,anydtdtm32.);
format SystemPeakDate2 datetime19. ;

在INPUT()函数调用中使用哪种信息格式取决于源变量中的字符串的外观。 ANYDTDTM信息将尝试猜测日期时间值的许多不同字符表示形式的值。但是,如果您的原始值具有按MDY或DMY顺序排列的日期部分,则可能无法正确确定诸如“ 10/12/2018”之类的不明确值。因此,最好使用与实际值的构造方式匹配的信息。

如果您想将数字转换为字符,那么也许您想使用PUT()函数呢?

SystemPeakDate=put(&sp_datetime,datetime19.-L);

然后,无需将格式附加到字符变量SystemPeakDate。 SAS已经知道如何在没有任何特殊格式说明的情况下显示字符变量。