SAS Быстрая перемотка даты до предела с использованием INTNX / INTCK - PullRequest
0 голосов
/ 12 сентября 2018

Я собираюсь взять переменную дату наблюдения и, по сути, продолжать откатывать ее по указанному параметру переоценки до целевой даты

используется набор данных:

data have;
input repricing_frequency date_of_last_repricing end_date;
datalines;

3 15399 21367
10 12265 21367
15 13879 21367
;

format date_of_last_repricing end_date date9.;
informat date_of_last_repricing end_date date9.;
run;

так что идея заключается в том, что я буду применять частоту переоценки (3 месяца, 10 месяцев или 15 месяцев) к date_of_last_repricing до тех пор, пока она не станет настолько близкой, насколько это возможно, к дате "31DEC2017". Заранее спасибо.

РЕДАКТИРОВАТЬ включая мои последние работы:

data want;
set have;

repricing_N = intck('Month',date_of_last_repricing,'31DEC2017'd,'continuous');

dateoflastrepricing = intnx('Month',date_of_last_repricing,repricing_N,'E');

format dateoflastrepricing date9.;
informat dateoflastrepricing date9.;
run;

1 Ответ

0 голосов
/ 12 сентября 2018

Функция INTNX вычисляет увеличенное значение даты и позволяет указать результирующее выравнивание интервала (в вашем случае это «конец» месяца через n месяцев)

data have;

  format   date_of_last_repricing end_date date9.;
  informat date_of_last_repricing end_date date9.;

  * use 12. to read the raw date values in the datalines;
  input repricing_frequency date_of_last_repricing: 12.  end_date: 12.;
datalines;
3 15399 21367
10 12265 21367
15 13879 21367
;
run;

data want;
  set have;

  status = 'Original';
  output;

  * increment and iterate;
  date_of_last_repricing = intnx('month',
      date_of_last_repricing, repricing_frequency, 'end'
  );
  do while (date_of_last_repricing <= end_date);
    status = 'Computed';
    output;
    date_of_last_repricing = intnx('month',
        date_of_last_repricing, repricing_frequency, 'end'
    );
  end;
run;

Если вы хотите вычислить только ближайшую конечную дату, как при итерации по частоте переоценки, вам не нужно итерировать. Вы можете разделить месяцы на частоту, чтобы получить количество итераций, которые могли бы произойти.

data want2;
  set have;

  nearest_end_month = intnx('month', end_date, 0, 'end');
  if nearest_end_month > end_date then nearest_end_month = intnx('month', nearest_end_month, -1, 'end');

  months_apart = intck('month', date_of_last_repricing, nearest_end_month);
  iterations_apart = floor(months_apart / repricing_frequency);

  iteration_months =  iterations_apart * repricing_frequency;

  nearest_end_date = intnx('month', date_of_last_repricing, iteration_months, 'end');

  format nearest: date9.;
run;

proc sql;
  select id, max(date_of_last_repricing) as nearest_end_date format=date9. from want group by id;
  select id, nearest_end_date from want2;
quit;
...