Печать
Категория: Статьи
Просмотров: 26582

Новая рубрика. Перевод небольших учебных пособий SAS Tips, публикующихся экспертами SAS в официальных блогах на английском. Есть интересные и полезные уроки

Начнем с туториала по функциям INTCK и INTNX. Урок построен на примере президентов США, ну так и писал американский эксперт Rick Wicklin :)

INTCK и INTNX: Две важные функции для вычисления интервалов между датами в SAS

На прошлой неделе я продемонстрировал временную шкалу для здравствующих президентов США. Число здравствующих президентов постоянно в течение временного интервала между датами инаугурации и датами смерти президентов. Данные были взяты из таблицы в Википедии (приведена ниже), в которой показано количество лет и дней между событиями. В этой статье описано, как использовать функции INTCK и INTNX в SAS для вычисления времени между событиями в этом формате. В частности, я использую два малоизвестных варианта этих функций, которые облегчают эту задачу

Интервалы между датами

Если вы вычисляете интервал между двумя датами (датой начала и датой окончания), есть две функции SAS, о которых вы обязательно должны знать.

Две эти функции дополняют друг друга: одна вычисляет разницу между двумя датами, а другая позволяет добавлять единицы времени к значению даты.

По умолчанию эти функции используют количество "календарных границ" между датами, таких как первый день года, месяц или неделя. Например, если вы хотите измерить годовые интервалы, то функция INTCK подсчитывает, сколько раз происходило 1 января (01JAN) между датами, а функция INTNX возвращает дату будущего 1 января (01JAN). Аналогично, если вы измеряете месячные интервалы, то функция INTCK подсчитывает, сколько первых дней месяцев произошло между двумя датами, а функция INTNX возвращает будущую дату первого числа месяца.

Параметры для подсчета годовщин

Обе функции поддерживают множество параметров. Если вы хотите рассчитать количество полных годовых интервалов, а не просто количество канунов нового года, можно воспользоваться параметрами этих функций (начиная с SAS 9.2) для подсчета количества годовщин между двумя датами и вычисления даты будущей годовщины. Вы можете использовать параметр "CONTINUOUS" для функции INTCK и параметр "SAME" для функции INTNX следующим образом:

Параметр "CONTINUOUS" для функции INTCK позволяет подсчитать количество годовщин одной даты, которые произошли до наступления второй даты. Например, выражение

Years = intck('year', '30APR1789'd, '04MAR1797'd, 'continuous');

возвращает значение 7, потому что между этими двумя датами существует 7 полных лет (годовщин 30 апреля). Без параметра "CONTINUOUS" функция возвращает 8, потому что 1 января (01JAN) происходит 8 раз между этими датами.

Выражение

Anniv = intnx('year', '30APR1789'd, 7, 'same');

возвращает 7-ю годовщину даты 30APR1789. Другими словами, он возвращает 30APR1796.

Прелесть этих функций заключается в том, что они автоматически обрабатывают високосные годы! Если вы запрашиваете количество дней между двумя датами, функция INTCK включает в себя високосные дни. Если событие происходит в високосный день, и вы определяете следующую годовщину этого события с помощью функции INTNX, вы получите 28 февраля (28FEB) следующего года (это наиболее распространенная схема для годовщин с високосными днями).

Алгоритм вычисления количества лет и дней между событиями

Следующий алгоритм вычисляет количество лет и дней между датами в SAS:

На следующем этапе вычисляем временной интервал в годах и днях между датами инаугурации и датами смерти для нескольких первых президентов США. Полученные переменные Year и Day содержат ту же информацию, что и в таблице Википедии.

data YearDays;
format Date prevDate anniv Date9.;
input @1  Date anydtdte12.
      @13 Event $26.;
prevDate = lag(Date);
if _N_=1 then do;                               /* when _N_=1, lag(Date)=. */
   Years=.; Days=.; return;            /* set years & days, go to next obs */
end;
Years = intck('year', prevDate, Date, 'continuous'); /* num complete years */
Anniv = intnx('year', prevDate, Years, 'same');      /* most recent anniv  */
Days = intck('day', anniv, Date);                    /* days since anniv   */
datalines;
Apr 30, 1789 Washington Inaug
Mar 4, 1797  J Adams Inaug
Dec 14, 1799 Washington Death
Mar 4, 1801  Jefferson Inaug
Mar 4, 1809  Madison Inaug
Mar 4, 1817  Monroe Inaug
Mar 4, 1825  JQ Adams Inaug
Jul 4, 1826  Jefferson Death
Jul 4, 1826  J Adams Death
run;
 
proc print data=YearDays;
var Event prevDate Date Anniv Years Days;
run;


Выводы и ссылки

Таким образом, функции INTCK и INTNX незаменимы для вычисления интервалов между датами. В этой статье я подчеркнул важность двух малоизвестных параметров этих функций: параметра "CONTINUOUS" в INTCK и параметра "SAME" в INTNX. Используя эти параметры, вы можете рассчитать количество годовщин между датами и последнюю годовщину. Таким образом, вы можете рассчитать количество лет и дней между двумя датами.

Об определении дат и интервалов между датами в SAS написано множество статей. Я рекомендую следующие статьи:

И наконец, знаете ли вы, что означают аббревиатуры INTCK и INTNX? Очевидно, что часть "INT" относится к слову INTervals ("интервалы"). По общему мнению, "INTCK" означает "Interval Check" (проверка интервала), а "INTNX" – "Interval Next" (следующий интервал).

Оригинал статьи на английском