Преобразование 'MM.YYYY' в формат даты SAS, например, mmyy10 - PullRequest
0 голосов
/ 01 марта 2019

У меня есть строка символов 'MM.YYYY', и я хочу преобразовать ее в формат даты в SAS - что-то вроде format mmyy10..Я знаю, что, поскольку я скучаю по дню, я не могу использовать SAS day format

Сейчас я решаю эту проблему следующим образом:

data testdate;

chardate = '06.2010';
ch_month = int(chardate);
ch_year = (chardate-ch_month)*10000;
date = mdy(ch_month,15,ch_year);
format date mmyy10.;

run;
proc print data=testdate;
run;

У меня есть одна проблема - год будет на на год меньше , чем я ожидаю.Итак, мой вывод 06M2009 ?!Я не получаю ошибок вообще.Что не так с этим кодом?Другое дело - есть ли (я уверен, что есть) лучший / более хороший способ решения этой проблемы?

РЕДАКТИРОВАТЬ: Исправлена ​​ошибка в MWE, благодаря @ Reeza

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Просто используйте функцию INPUT ().Добавьте день месяца, чтобы у вас было правильное значение даты для ввода.

date = input('01.'||chardate,ddmmyy10.);

В ваших исходных вычислениях используется неявное преобразование типов, а не использование арифметики с плавающей запятой.Добавьте ЛУЧШИЙ32.формат, чтобы увидеть ваши фактические значения.

data testdate;
  chardate = '06.2010';
  ch_month = int(chardate);
  ch_year = (chardate-ch_month)*10000;
  date = mdy(ch_month,15,ch_year);
  format _numeric_ best32. date yymmdd10.;
  put (_all_) (=);
run;

NOTE: Character values have been converted to numeric values at the places given by: (Line):(Column).
      108:17   109:18
chardate=06.2010 ch_month=6 ch_year=2009.99999999999 date=2009-06-15
NOTE: The data set WORK.TESTDATE has 1 observations and 5 variables.

Попробуйте добавить вызов функции ROUND ()

date = mdy(ch_month,15,round(ch_year,1));
0 голосов
/ 01 марта 2019

Вот два способа преобразовать ее в дату SAS.Дата SAS должна содержать компонент «день», даже если он не показан.Я установил его на 1 здесь.

INPUT () преобразует символ в число, чтобы избежать примечаний по преобразованию в журнале. SUBSTR () получает месяц / год из строки символов.

date = mdy(input(substr(chardate, 2, 2), 8.), 1, input(substr(chardate, 4, 4), 8.));

Или другой подход заключается в прямом использовании INPUT,Сначала удалите точку с помощью функции COMPRESS (), затем объедините 01 в начало даты и прочитайте ее как форматированную дату в формате DDMMYY.

date2 = input(compress('01'||chardate, "."), ddmmyy10.);

Полный код здесь:

data testdate;

chardate = '06.2010';
date = mdy(input(substr(chardate, 2, 2), 8.), 1, input(substr(chardate, 4, 4), 8.));

date2 = input(compress('01'||chardate, "."), ddmmyy10.);

format date: mmyy10.;

run;
proc print ;
run;

enter image description here

...