日安。在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;会出什么问题呢?
发布于 2018-12-14 22:51:05
您收到的错误是因为您试图将数字格式与字符变量相关联。
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;在数据步骤中,您可以省略$sign,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.发布于 2018-12-14 22:54:24
错误消息指出错误所在。您正在尝试将数字格式附加到字符变量。因此,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 ()函数和生成数值的informat。所以你可能想要这样的东西:
SystemPeakDate2=input(SystemPeakDate,anydtdtm32.);
format SystemPeakDate2 datetime19. ;在INPUT()函数调用中使用的informat取决于source变量中的字符串的外观。ANYDTDTM informat将尝试猜测DateTime值的许多不同字符表示的值代表什么。但是,如果您的原始值具有MDY或DMY顺序的日期部分,那么对于像'10/12/2018‘这样的多义值,它可能不会做出正确的决定。因此,最好使用与实际值的构造方式相匹配的informat。
如果您想要将数字转换为字符,那么您可能希望使用PUT()函数。
SystemPeakDate=put(&sp_datetime,datetime19.-L);这样就不需要将格式附加到字符变量SystemPeakDate。SAS已经知道如何在没有任何特殊格式化指令的情况下显示字符变量。
https://stackoverflow.com/questions/53773077
复制相似问题