美好的一天。在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;
怎么了?
答案 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已经知道如何在没有任何特殊格式说明的情况下显示字符变量。