Что не так с моим преобразованием char в datetime в SAS? - PullRequest
0 голосов
/ 14 декабря 2018

Добрый день.В 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 голосов
/ 14 декабря 2018

В сообщении об ошибке указано, что не так.Вы пытаетесь присоединить числовой формат к символьной переменной.Таким образом, 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 () с функцией informat, которая генерирует числовые значения.Так что, возможно, вам нужно что-то вроде:

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

То, какой информат используется в вызове функции INPUT (), зависит от того, как выглядят строки символов в исходной переменной.Информат ANYDTDTM попытается угадать, что представляют значения для ряда различных символьных представлений значений даты и времени.Но если ваши исходные значения имеют часть даты в порядке MDY или DMY, это может привести к неправильному решению для неоднозначных значений, таких как «10/12/2018».Поэтому лучше использовать информацию, которая соответствует построению ваших фактических значений.

Если вы хотите преобразовать цифру в символ, то, возможно, вы хотите использовать вместо нее функцию PUT ()?

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

Тогда нет необходимости прикреплять формат к символьной переменной SystemPeakDate.SAS уже знает, как отображать символьные переменные без каких-либо специальных инструкций по форматированию.

0 голосов
/ 14 декабря 2018

Ошибка, которую вы получаете, заключается в том, что вы пытаетесь связать числовой формат с символьной переменной.

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.
...