Новая рубрика. Перевод небольших учебных пособий SAS Tips, публикующихся экспертами SAS в официальных блогах на английском. Есть интересные и полезные уроки
Начнем с туториала по функциям INTCK и INTNX. Урок построен на примере президентов США, ну так и писал американский эксперт Rick Wicklin :)
INTCK и INTNX: Две важные функции для вычисления интервалов между датами в SAS
На прошлой неделе я продемонстрировал временную шкалу для здравствующих президентов США. Число здравствующих президентов постоянно в течение временного интервала между датами инаугурации и датами смерти президентов. Данные были взяты из таблицы в Википедии (приведена ниже), в которой показано количество лет и дней между событиями. В этой статье описано, как использовать функции INTCK и INTNX в SAS для вычисления времени между событиями в этом формате. В частности, я использую два малоизвестных варианта этих функций, которые облегчают эту задачу
Интервалы между датами
Если вы вычисляете интервал между двумя датами (датой начала и датой окончания), есть две функции SAS, о которых вы обязательно должны знать.
- Функция INTCK возвращает количество единиц времени между двумя датами. В качестве единицы времени можно выбрать годы, месяцы, недели, дни и многое другое. Например, в своей предыдущей статье я использовал функцию INTCK для определения количества дней между двумя датами.
- Функция INTNX возвращает дату SAS, которая отстоит от указанной даты на указанное количество единиц времени. Например, функцию INTNX можно использовать для вычисления даты, которая находится на 308 дней позже указанной даты.
Две эти функции дополняют друг друга: одна вычисляет разницу между двумя датами, а другая позволяет добавлять единицы времени к значению даты.
По умолчанию эти функции используют количество "календарных границ" между датами, таких как первый день года, месяц или неделя. Например, если вы хотите измерить годовые интервалы, то функция 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:
- Используйте функцию INTCK с параметром "CONTINUOUS", чтобы вычислить количество полных лет между двумя датами.
- Используйте функцию INTNX, чтобы найти третью дату (дату годовщины), которая совпадает с начальной датой по месяцу и дню, но происходит за год до конечной даты. (Годовщина для високосных дней – это 28FEB или 29FEB, в зависимости от того, происходит ли годовщина в високосном году.)
- Используйте функцию INTCK для вычисления количества дней между датой годовщины и датой окончания.
На следующем этапе вычисляем временной интервал в годах и днях между датами инаугурации и датами смерти для нескольких первых президентов США. Полученные переменные 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 написано множество статей. Я рекомендую следующие статьи:
- Краткое введение в функции даты и времени SAS – статья Andrew Karp (2003) "Working with SAS Date and Time Functions." К сожалению, эта статья была написана до того, как были добавлены параметры "CONTINUOUS" и "SAME".
- Я узнал о параметре "SAME" из короткой статьи Bruce Gilsen (2006) "Improve Your Dating: The INTNX Function Alignment Value SAMEDAY."
- Более подробную статью с массой примеров, включая примеры использования параметров "CONTINUOUS" и "SAME", написал Derek Morgan (2015) "Demystifying Date and Time Intervals." Derek также написал книгу The Essential Guide to SAS Dates and Times (Second Edition, 2014)
И наконец, знаете ли вы, что означают аббревиатуры INTCK и INTNX? Очевидно, что часть "INT" относится к слову INTervals ("интервалы"). По общему мнению, "INTCK" означает "Interval Check" (проверка интервала), а "INTNX" – "Interval Next" (следующий интервал).