Преобразовать символьную дату в форматированную дату - PullRequest
0 голосов
/ 31 октября 2018

У меня есть следующий набор данных, где значения в date имеют общий формат <character d>mmyy:

DATA df;
INPUT date $;
DATALINES;
d0101
d0102
d0103
d0104
;
RUN;

Я хочу, чтобы каждая строка в df превратилась в следующее (числовой / тип даты):

01JAN2018
02JAN2018
03JAN2018
04JAN2018

Вот моя попытка:

DATA df_new;
    SET df;

    FORMAT date DATE9.;

    date = INPUT(SUBSTR(date, 2, 2) || PUT(INPUT(SUBSTR(date, 4, 2), 8.), MONNAME3.) || PUT(YEAR(TODAY()), 4.), DATE9.);
RUN;

Однако, это просто дает мне следующее:

21185
21185
21185
21185

Как я могу завершить это преобразование?

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

что-то вроде ниже с использованием функции mdy и применением date9. форматировать после создания даты с помощью функции mdy, для создания которой может потребоваться день месяца и год

DATA df;
INPUT date $;
DATALINES;
 d0101
 d0102
d0103
d0104
;
RUN;
data want;
  set df;
   new_date=mdy(input(substr(date,2,2),2.), input(substr(date,4,2),2.), year(today()));
  format new_date date9.;
run;

Вы также можете использовать

 new_date=mdy(substr(date,2,2), substr(date,4,2), year(today()));

но в вашем журнале будет следующее сообщение

  NOTE: Character values have been converted to numeric values at the places 
  given by: (Line):(Column).
0 голосов
/ 01 ноября 2018

Преобразование идентично тому, на которое я ответил на ваш другой вопрос.

Нет необходимости для извлечения числовых аспектов в строке с предполагаемой конструкцией d<mm><dd> для подачи в MDY. Вместо этого конкретизируйте строковое представление даты и используйте input с информатором даты, чтобы установить значение даты SAS (которое представляет собой просто число, представляющее количество дней с даты SAS, то есть 01JAN1960). Значения даты SAS отображаются в соответствии с форматом. Если оставить неформатированным, вы увидите только целое число. Форматирование переменной как date9. приведет к тому, что вывод отобразит соответствующий <dd><mon><yyyy> или формат yymmdd10., который будет отображаться как <yyyy>-<mm>-<dd>

date_value = input (cats(year(today()), substr(date,2)), yymmdd10.);
format date_value date9.;

или более явно

year_string = cats(year(today());
mmdd_string = substr(date,2);
yyyymmdd_string = cats(year_string,mmdd_string);
date_value = input(yyyymmdd_string, yymmdd10.);
format date_value date9.;

Если вам абсолютно необходимо (маловероятно) сохранить дату, представленную в виде строки, обратно в исходную переменную даты, вам придется использовать put, чтобы вызвать рендеринг во время присвоения значения.

date = put(date_value, date9.);
0 голосов
/ 31 октября 2018

Вы применяете формат, но переменная date все еще содержит числовое значение (число дней с начала SAS). Вы также неправильно используете переменную date . В наборе данных df он создается как символ, в df_new вы записываете в него числовое значение. Чтобы исправить это, измените date на dateN в наборе данных df_new . И, наконец, чтобы преобразовать его в символ, нужно выполнить еще один шаг:

...
dateN = input(substr(date, 2, 2) || put(input(substr(date, 4, 2), 8.), monName3.) || put(year(today()), 4.), date9.);
length dateC $9;
dateC = put(dateN, date9.)
...
...