首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SAS中我的char到datetime的转换有什么问题?

在SAS中我的char到datetime的转换有什么问题?
EN

Stack Overflow用户
提问于 2018-12-14 11:22:28
回答 2查看 495关注 0票数 0

日安。在Base SAS中,我尝试将字符转换为日期时间格式。字符来自宏变量。我试着转换它,但失败了。它报告无效的格式$DATETIME,表明我的转换失败。现在我迷失了。

我得到了这个错误:

代码语言:javascript
复制
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;

我的代码:

代码语言:javascript
复制
    %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;

会出什么问题呢?

EN

回答 2

Stack Overflow用户

发布于 2018-12-14 22:51:05

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

代码语言:javascript
复制
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将提供它。考虑这个例子。

代码语言:javascript
复制
51   data _null_;
52      x = 'xyz';
53      format x 2.;
54      f = vformat(x);
55      put x= f=;
56      run;

x=xy f=$CHAR2.
票数 0
EN

Stack Overflow用户

发布于 2018-12-14 22:54:24

错误消息指出错误所在。您正在尝试将数字格式附加到字符变量。因此,SAS试图提供帮助,并假设您只是忘记了在格式名称上放置$前缀。但是,它无法找到名为$DATETIME的字符格式。因此出现了错误消息。

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

还有,你为什么要做这个两步的过程呢?

代码语言:javascript
复制
SystemPeakDate2=&sp_datetime;
SystemPeakDate=input(SystemPeakDate2,best32.);

首先,您要将SystemPeakDate2创建为一个数值变量。查看日志中的MPRINT行。

代码语言:javascript
复制
MPRINT(ALFRED):   SystemPeakDate2=1858869000;
MPRINT(ALFRED):   SystemPeakDate=input(SystemPeakDate2,best32.);

尝试使用INPUT()函数将其转换为数字只会强制SAS首先将其转换为字符串,以便INPUT()函数有一个字符串可供读取。

如果您想将输入从字符转换为数字,那么可以使用SystemPeakDate ()函数和生成数值的informat。所以你可能想要这样的东西:

代码语言:javascript
复制
SystemPeakDate2=input(SystemPeakDate,anydtdtm32.);
format SystemPeakDate2 datetime19. ;

在INPUT()函数调用中使用的informat取决于source变量中的字符串的外观。ANYDTDTM informat将尝试猜测DateTime值的许多不同字符表示的值代表什么。但是,如果您的原始值具有MDY或DMY顺序的日期部分,那么对于像'10/12/2018‘这样的多义值,它可能不会做出正确的决定。因此,最好使用与实际值的构造方式相匹配的informat。

如果您想要将数字转换为字符,那么您可能希望使用PUT()函数。

代码语言:javascript
复制
SystemPeakDate=put(&sp_datetime,datetime19.-L);

这样就不需要将格式附加到字符变量SystemPeakDate。SAS已经知道如何在没有任何特殊格式化指令的情况下显示字符变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53773077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档