포스팅 목차
211. INTCK
2개의 날짜, 시간, datetime 값 사이에서 사용자가 계산하기 위하여 지정한 날짜 유형에 대한 시간 간격(구간 경계, interval boundaries)의 개수(차이 및 경과 기간)를 반환한다.
Category: | SAS 날짜/시간 함수 (Date and Time) |
문 법
INTCK (‘interval<Multiple><.shift>', from, to) |
Arguments
- interval
시간 간격(날짜 구간값, 구간 간격)의 이름이 포함된 문자형 상수, 변수 또는 표현식을 지정합니다. Interval 은 대문자 또는 소문자로 표시할 수 있다. 간격의 유형(날짜, datetime 또는 시간)은 start-date 의 값 유형과 일치해야 한다. Multipliers(승수) 및 shift(시프트) 인덱스를 기본 간격 이름과 함께 사용하여 보다 복잡한 간격을 지정할 수 있다. 구간 간격 이름의 일반적인 형태는 다음과 같다.
1) interval<multiple.shift-index>
구간 간격 이름은 다음과 같이 세 부분으로 구성 될 수 있다.
(1) interval : 기본 간격 유형의 이름을 지정한다. 예를 들어, YEAR로 연도 간격을 지정한다.
(2) multiple : 기본 간격 유형의 기간에 대한 배수와 동일한 간격을 설정하기 위한 multiplier(승수)를 지정한다. 이 옵션은 사용자가 선택적으로 지정 할 수 있다. 예를 들어, 구간 간격 YEAR2는 2년의 기간 간격, 즉 격년을 표시한다.
(3) custom-interval : 는 SAS 데이터 세트에 의해 정의되는 사용자 정의 간격을 지정한다. 각 관측치에는 두 개의 변수 begin 과 end 가 포함된다.
(4) shift-index : 지정된 하위 기간의 시작 지점에서 시작하도록 구간 간격을 이동시키는 shift index(이동 인덱스)를 지정한다. 이 옵션은 사용자가 선택적으로 지정 할 수 있다. 예를 들어, YEAR.3은 매년 3월 1일에 시작하여 다음 해 2월 말에 종료되도록 연도별 기간을 지정한다. Shift index는 전체 구간 간격의 하위 구간의 개수보다 작아야 한다. 예를 들어, 2 년 구간 간격에는 25 번째 달이 존재하지 않으므로 YEAR2.24는 사용할 수 있지만 YEAR2.25는 오류를 발생한다.
(5) start-date : 시작하는 SAS 날짜, 시간 또는 datetime 값을 나타내는 SAS 표현식을 지정한다.
(6) end-date : 종료하는 SAS 날짜, 시간 또는 datetime 값을 나타내는 SAS 표현식을 지정한다.
Commonly Used Intervals with Optional Multiplier and Shift Indexes
Interval | Description |
DAY3 | 3일 간격 |
WEEK | 일요일(1)을 시작 시점으로 하는 주간 간격 |
WEEK.7 | 토요일(7)을 시작 시점으로 하는 주간 간격 |
WEEK6.13 | 두 번째 금요일(7+6)을 시작 시점으로 6주 간격. |
WEEK2 | 첫 번째 일요일(1)을 시작 시점으로 하는 격주 간격 |
WEEK1.1 | WEEK와 동일 |
WEEK.2 | 월요일(2)을 시작 시점으로 하는 주 단위의 간격 |
WEEK6.3 | 첫 번째 화요일(3)을 시작 시점으로 하는 6주 간격 |
WEEK6.11 | 두 번째 수요일을 시작 시점으로 시작하는 6주 간격 |
WEEK4 | 첫 번째 일요일을 시작 시점으로 시작하는 4주 간격 |
WEEKDAY | 토요일과 일요일을 주말로 하고, 5일을 근무일로 하는 주 5일 근무제 |
WEEKDAY1W | 일요일을 주말로 하고, 6일을 근무일로 하는 주 6일제 |
WEEKDAY35W | 화요일과 목요일을 주말로 하고, 5일을 근무하는 주 5일제(W는 화요일(3)과 목요일(5)이 주말임을 표시한다.) |
WEEKDAY17W | WEEKDAY와 동일 |
WEEKDAY67W | 금요일(6)과 토요일(7)을 주말로 하는 주 5일 근무제 |
WEEKDAY3.2 | 토요일과 일요일을 주말로 하고, 월요일(2)부터 시작하여 진행되는 3주 간격 (간격은 1960년 1월 1일을 기준으로 정렬된다. 같은 해에 중첩되는 간격에 대해서는 1960년 1월 1일로 거슬러 올라가서 재정렬을 할 필요가 없다.) 1주 : 1960-01-04(월), 1960-01-07(목) 2주 : 1960-01-12(화), 1960-01-15(금) 3주 : 1960-01-20(수) 1주 : 1960-01-25(월), 1960-01-28(목) |
TENDAY4.2 | 2번째 TENDAY (1-10일, 11-20일, 21-월말 단위) 기간을 시작 시점해서 40일(Four ten-day) 기간 간격 |
SEMIMONTH2.2 | 매월 16일에서 다음 달 15일까지의 간격 (SEMIMONTH 의 기간 단위는 1-15일, 16-월말 기준이다.) |
MONTH2.2 | 2월-3월, 4월-5월, 6월-7월, 8월-9월, 10월-11월,1 2월- 이듬해 1월 |
MONTH2 | 1월-2월, 3월-4월, 5월-6월, 7월-8월, 9월-10월, 11월-12월 |
QTR3.2 | 1960년 2월 1일, 1960년 11월 1일, 1961년 8월 1일, 1962년 5월 1일 등으로 이어지는 9개월(3 * 3) 간격 ( 2023년 2월 1일 / 9개월, 2023 년 11월 1일 / 9개월 , 2024 년 8월 1일 / 9개월 , 2025년 5월 1일 / 9개월 ) |
SEMIYEAR.3 | 3월을 시작 시점으로 산정하여서 6개월 간격, 3월~8월 및 9월~2월 |
YEAR.10 | 10월부터 시작되는 회계연도 |
YEAR2.7 | 짝수 해의 7월을 시작 시점으로 해서 격년 간격(2년에 한 번. Biennial intervals) |
YEAR2.19 | 홀수 해의 7월을 시작 시점으로 해서 격년 간격(2년에 한 번. Biennial intervals) |
YEAR4.11 | 윤년 11월을 시작 시점으로 해서 4년 간격(미국 대통령 선거 주기) |
YEAR4.35 | 윤년 사이에 존재하는 짝수 해의 11월을 시작 시점으로 해서 4년 간격(미국 중간선거 주기) |
DTMONTH13 | 1957년 11월 1일, 1958년 12월 1일, 1960년 1월 1일, 1961년 2월 1일, 1962년 3월 1일 등과 같이 1960년 1월 1일 자정을 기점으로 13개월 간격 |
HOUR8.7 | 오전 6시, 오후 2시 및 오후 10시를 시작 시점으로 하여 8시간 간격 (근무 교대 시 사용 가능) ( 새벽 0시(1), 오전 1시(2) ------ 오전6시(7) ) |
- WEEK 의 경우, 1959년 12월 27일(일요일) 0시 정각이 기간 산정 시작 기준일이고, 그 외의 경우, 1960년 1월 1일 0시 정각이 개시 기준일이다.
Optional Argument
- 'method'
불연속 또는 연속(CONTINUOUS) 방법 중 어떤 방식으로 간격을 계산할지 여부를 지정한다. method 는 따옴표 안에 작성해야 하며, Method 에는 다음 값 중 하나를 지정할 수 있다.
(1) CONTINUOUS : 연속된 기간을 측정 단위로 지정한다. 구간 간격은 시작일을 기준으로 이동한다. CONTINUOUS 방법은 기념일 계산하는 경우 유용하다. 예를 들어, 다음 프로그램을 실행하여 부부의 결혼한 연수를 계산할 수 있다.
SAS Statements |
data b;
WeddingDay='14feb2021'd;
Today=today();
YearsMarried=intck('YEAR', WeddingDay, today(), 'C');
format WeddingDay Today date9.;
put WeddingDay=;
put Today=;
put YearsMarried=;
run;
Results |
WeddingDay=14FEB2021
Today=05MAR2021
YearsMarried=0
CONTINUOUS 방법의 경우, 2001년 2월 14일부터 2021년 3월 12일까지의 월 단위 구간 간격은 0개월이다.
(2) DISCRETE : 연속되지 않는 기간을 측정 단위로 지정한다. DISCRETE 방법은 구간 간격의 경계(예를 들어, 월말)를 계산하기 위해 사용된다. 기본 DISCRETE 방법은 시계열 관측치를 구간(bins)으로 분류하여 처리하는 경우 유용하다. 예를 들어, 일별 데이터를 월 단위의 시계열로 처리하기 위하여 월별 데이터로 누적 할 수 있다. DISCRETE 방법의 경우 2021년 1월 31일부터 2021년 2월 1일까지의 간격을 월 단위로 표시하면 1개월이 된다.
상세 내용
달력 구간 간격 계산하기(Calendar Interval Calculations)
개별 시간 간격 내에 포함된 값은 모두 동일한 것으로 간주한다. 즉, 월 간격을 지정한 경우 2021년 1월 1일과 2021년 1월 15일은 동일하다는 것을 의미한다. 이 두 날짜는 2021년 1월 1일에 시작하여 2021년 1월 31일에 종료되는 구간 간격(Interval)을 나타낸다. 이 구간 간격을 표시하기 위하여 구간 간격 시작일(2021년 1월 1일) 또는 구간 간격 종료일(2021년 1월 31일)을 사용할 수 있다. 이 날짜는 월 구간 간격(Monthly interval) 내의 모든 날짜를 나타낸다.
다음 예에서 start-date('14JAN2021'd)는 2021년 1분기에 해당한다.
intck('qtr', '14JAN2021'd, '02SEP2021'd); |
end-date('02SEP2021'd)는 2021년 3분기에 해당한다. 구간 간격 수, 즉 start-date와 end-date 로 이동하면서 구간 간격의 시작 부분이 포함되는 횟수는 2이다. (2분기의 시작과 3분기의 시작 부분)
기본 DISCRETE 방법을 사용하는 INTCK 함수는 첫 번째 날짜에서 두 번째 날짜로 이동하는 중간에 다음 간격의 시작점이 포함된 횟수를 카운트 한다.
- 함수 INTCK('MONTH', '1jan2021'd, '31jan2021'd) 는 두 날짜가 동일한 달에 존재하므로 0을 반환한다.
- 함수 INTCK('MONTH', '31jan2021'd, '1feb2021'd)는 두 날짜가 한 달 간격으로 서로 다른 달에 속하기 때문에 1을 반환한다.
- INTCK('MONTH', '1feb2021'd, '31jan2021'd) 함수는 첫 번째 날짜가 두 번째 날짜보다 한 달 이전의 서로 다른 구간 간격에 존재하기 때문에 –1을 반환한다. (첫 번째 날짜가 두 번째 날짜보다 시간의 선후 관계에서 뒤에 존재하고, 두 날짜가 동일한 불연속 구간 간격 내에 존재하지 않을 경우 INTCK 함수는 항상 음수 값을 반환한다.)
DISCRETE 방법을 사용하는 경우, WEEK 구간 간격은 start-date 와 end-date 사이에 존재하는 일요일(주의 첫번째 요일)의 개수에 따라 결정되며, 해당 날짜 사이에 7일 기간 간격이 몇 개 포함되어 있는지는 고려하지 않는다. start-date 와 end-date 사이에 존재하는 7일 기간의 개수를 카운트하려면 CONTINUOUS 방법을 사용해야 한다.
multiple 인수와 shift-index 인수는 모두 선택적으로 지정하는 옵션이며, 기본값은 1이다. 예를 들어 YEAR, YEAR1, YEAR.1, YEAR1.1 은 모두 일반 달력 연도를 지정하는 동일한 방법이다.
이 예제에서는 10월 31일과 3월 31일 사이에는 5개월이 존재한다. 연속형 방법으로는 5개월은 2분기와 같지 않다.
INTCK 함수는 구간 간격 경계를 넘어간(통과한) 횟수를 반환한다. 이 숫자는 delta(변화, 차이)이다. 현재 월을 포함하려면 숫자 하나를 추가해야 한다. 이 숫자는 span(기간, 범위)이다. 일요일부터 수요일까지의 span은 4일간(일요일, 월요일, 화요일, 수요일) 이다. 일요일부터 수요일까지의 delta는 3일(일요일부터 월요일, 월요일부터 화요일, 화요일부터 수요일까지)이다. INTCK 함수는 span(기간)이 아닌 델타를 계산하지만 delta와 span(기간) 사이의 차이는 항상 1이다. ( span : 두 날짜 사이의 기간, delta : 두 날짜의 차이)
Date 와 Datetime 의 구간 기간(Date and Datetime Intervals)
SAS datetime 값과 함께 사용해야 하는 구간 간격은 SAS datetime 구간 간격이다. Datetime 구간 간격을 형성하려면 날짜 구간 간격에 접두사 "DT"를 추가하여 구성해야 한다. 예를 들어, MONTH는 SAS 날짜 구간 간격, DTMONTH는 SAS datetime 구간 간격이다. 마찬가지로, YEAR는 SAS 날짜 구간 간격, DTYEAR는 SAS datetime 구간 간격이다.
구간 간격 함수에서 정확한 결과를 얻기 위해 날짜 값에 날짜 구간 간격을 사용하고 datetime 값에 datetime 구간 간격을 사용한다. 날짜 값을 datetime 구간 간격과 함께 사용하는 경우 SAS는 오류 메시지를 반환하지 않지만 올바르지 않은 결과를 반환한다.
다음 예제에서는 DTDAY datetime 구간 간격을 사용하여 2021년 8월 1일부터 2022년 2월 1일까지의 일수를 반환한다.
data _null_;
days=intck('dtday', '01aug2021:00:10:48'dt, '01feb2022:00:10:48'dt);
put days=;
run;
SAS는 로그에 다음 출력을 기록한다.
days=184
다음 예제는 매크로 변수와 함께 INTCK 함수를 사용하는 몇 가지 방법을 보여준다.
이 예제는 DATA 단계에서 datetime 리터럴을 보여준다.
data _null_;
x=intck('dtmonth','01jan2021:12:34:56'dt,'15mar2021:00:00:00'dt);
put x=;
run;
SAS는 로그에 다음 출력을 기록한다.
x=2
다음 예제는 DATA 단계에서 큰따옴표로 묶인 매크로 변수를 사용하여 datetime 리터럴을 표시한다.
%let from=01jan2021:12:34:56;
%let to=15mar2021:00:00:00;
data _null_;
x = intck('dtmonth',"&from."dt,"&to."dt);
put x=;
run;
SAS는 로그에 다음 출력을 기록한다.
x=2
다음 예제에서는 DATA 단계에서 dt 표시자와 함께 작은 따옴표로 묶인 매크로 변수를 사용하여 datetime 리터럴을 표시한다.
%let from='01jan2021:12:34:56'dt;
%let to='15mar2021:00:00:00'dt;
data _null_;
x = intck('dtmonth',&from.,&to.);
put x=;
run;
SAS는 로그에 다음 출력을 기록한다.
x=2
다음 예제에서는 DATA 단계에서 dt 표시자와 함께 큰 따옴표로 묶인 매크로 변수를 사용하여 datetime 리터럴을 표시한다.
%let from="01jan2021:12:34:56"dt;
%let to="15mar2021:00:00:00"dt;
data _null_;
x = intck('dtmonth',&from.,&to.);
put x=;
run;
SAS는 로그에 다음 출력을 기록한다.
x=2
다음 예제에서는 매크로 변수에 수치형 값을 사용하여 DATA 단계에서 datetime 리터럴을 보여준다.
data _null;
from = input('01jan2021:12:34:56',datetime19.);
to = input('15mar2021:00:00:00',datetime19.);
call symputx('from',from);
call symputx('to',to);
run;
data _null_;
x = intck('dtmonth',&from,&to);
put x=;
run;
SAS는 로그에 다음 출력을 기록한다.
x=2
%let x=%sysfunc(intck(dtmonth,&from,&to));
%put x=&x;
x=2
다음 예제에서는 %SYSFUNC와 함께 datetime 리터럴을 사용하는 방법을 보여준다.
%let from='01jan2021:12:34:56'dt;
%let to='15mar2021:00:00:00'dt;
%let x=%sysfunc(intck(dtmonth,&from,&to));
%put x=&x;
SAS는 로그에 다음 출력을 기록한다.
x=2
사용자 정의 시간 구간 간격(Custom Time Intervals)
사용자 지정 시간 구간 간격은 SAS 데이터 세트에서 정의된다. 데이터 세트에는 begin 변수가 포함되어야 하며, end 변수와 season 변수를 포함할 수도 있다. 각 관측치는 구간 간격의 시작점을 포함하는 begin 변수와 구간 간격의 끝을 포함하는 end 변수(존재하는 경우)로 하나의 구간 간격을 나타낸다. 구간 간격은 오름차순으로 나열해야 한다. 구간 간격 사이에는 공백 간격(gap)이 존재 할 수 없으며 또한 간격이 겹쳐서는 안 된다.
END 변수를 올바르게 정의하여 공백 간격의 발생을 방지해야 한다. 데이터의 공백으로 인해 계산 작업 중 오류가 발생할 수 있다. END 변수가 지정되지 않은 경우, 공백 간격과 중복을 피하기 위해서는 관측값이 BEGIN 변수를 기준으로 오름차순으로 정렬되어 있어야 한다. END 변수가 지정된 경우 공백과 중복 발생을 방지하기 위하여 적절히 정의해야 한다.
Overlap
관측치 n(ENDn) 에 대한 END 변수의 값이 k>n에 대해 BEGINk를 초과한다.
Gap
BEGIN n+1–ENDn > 1
Ascending
BEGINn≤ ENDn < BEGINn+1
SAS 시스템 옵션 INTERVALDS=는 사용자 지정 구간 간격을 정의하고 구간 간격 데이터 세트를 새로운 구간 간격 이름과 연결하는 데 사용된다. 다음 예제는 INTERVALDS=시스템 옵션을 지정하는 방법을 보여준다.
options intervalds=(interval=libref.dataset-name);
Argument
interval
구간 간격의 이름을 지정한다. interval 의 값은 libref.dataset-name 에서 명명된 데이터 세트이다.
libref.dataset-name
사용자가 지정한 공휴일이 포함된 파일의 라이브러리 참조자 이름과 데이터 세트 이름을 지정한다.
소매 달력 구간 간격(Retail Calendar Intervals)
소매업계에서는 1년을 13주로 구성된 4개의 기간으로 나누어 데이터를 계산하는 경우가 있다. 기간 형식은 4-4-5, 4-5-4 또는 5-4-4를 기반으로 하며, 첫 번째, 두 번째 및 세 번째 숫자는 각각 각 기간의 첫 번째, 두 번째 및 세 번째 달에 존재하는 주(weeks)의 개수를 지정한다.
참 고
* interval : 구하고 싶은 구간의 형태를 정한다.
[1] 날짜의 구간
구간 | 설명 |
DAY | 일자 |
WEEK | 주 |
WEEKDAY | 평일 |
TENDAY | 10일 기간. 1-10일, 11-20일, 21-월말 단위 |
SEMIMONTH | 2주 기간. 1-15일, 16-월말 단위 |
MONTH | 월 |
QTR | 분기 |
SEMIYEAR | 반년 |
YEAR | 년 |
[2] 시간의 구간
구간 | 설명 |
SECOND | 초 |
MINUTE | 분 |
HOUR | 시간 |
[3] DateTIME의 구간
구간 | 설명 |
DTDAY | 일자 |
DTWEEK | 주 |
DTWEEKDAY | 평일 |
DTTENDAY | 10일 기간 |
DTSEMIMONTH | 2주기간 |
DTMONTH | 월 |
DTQTR | 분기 |
DTSEMIYEAR | 반기 |
DTYEAR | 년 |
* Multiple : interval에 대한 간격을 삽입한다.
예) month2는 2개월 구간, DAY50은 50일 구간을 지정한다.
* Shift : 구간의 시작 위치를 정한다.
시작 위치를 정하지 않는 경우 1960년1월1일을 기준으로 하여 계산.
예) YEAR.4는 4월 1일을 시작위치로 매년 구간을 지정한다.
[1] SAS 날짜와 datetime 값에 대한 이동값
구간 | 설명 |
YEAR | 월 |
SEMIYEAR | 월 |
QTR | 월 |
MONTH | 월 |
SEMIMONTH | 반달 |
TENDAY | 10일 |
WEEKDAY | 일 |
WEEK | 일 |
DAY | 일 |
[2] SAS 시간 구간에 대한 이동값
구간 | 설명 |
HOUR | 시간 |
MINUTE | 분 |
SECOND | 초 |
[3] 구간에 대한 예제
구간 | 설명 |
YEAR | 1월 1일을 기준으로 매년 |
YEAR2 | 1960년 1월 1일을 기준으로 매 2년 |
YEAR.4 | 4월을 기준으로 매년 |
YEAR4.11 | 11월을 기준으로 매 4년 |
관련 함수
함수명 | 함수내용 |
DATDIF |
두 날짜 사이의 차이를 계산한다. |
DATE | SAS 날짜 값으로써 현재 날짜를 반환한다. |
INTCINDEX | 날짜, 시간 또는 datetime 구간이 주어졌을때 순환 지수(순환 주기, 순환 지표, cycle index) 값을 반환한다. |
INTCK | 2개의 날짜,시간,datetime 등의 차이를 구해 정수값을 반환한다. |
INTCYCLE | 날짜, 시간 또는 datetime 구간이 주어졌을때 다음으로 높은 (higher) 계절 주기의 날짜, 시간 또는 datetime 구간을 반환한다. |
INTFIT | 두 날짜 사이에 정렬되어 있는 time interval(시간 간격)을 반환한다. |
INTFMT | 날짜, 시간 또는 datetime 구간이 지정되었을때 사용하면 좋을 SAS format을 알려주는 함수 |
INTGET | Datetime 값들 또는 세가지 날짜 값들에 대한 간격(interval) 을 리턴 |
INTINDEX | 날짜, 시간 또는 datetime 구간이 주어졌을때 계절별 index를 반환한다. |
INTNX | 주어진 구간만큼, 날짜,시간,datetime등이 지난 날짜값을 반환한다. |
INTSEAS | 날짜, 시간 또는 datetime 구간이 주어졌을때 계절별 주기의 길이를 반환한다. |
INTSHIFT | 기본 interval에 상응하는 이동 간격(교대 간격, Shift Interval)을 반환한다. |
INTTEST |
시간 간격(time interval)이 유효하면 1을 반환하고, 그렇지 않으면 0을 반환한다. |
YRDIF | 사용자가 지정한 2개 날짜(date) 사이의 년도 차이를 계산한다. |
예 제
예 제 1 :
구간 기준값에 해당하는 구간의 차이를 반환한다.
SAS Statements |
data INTCK;
qtr = intck('qtr','10jan95'd,'01jul95'd);
put qtr;
year1 = intck('year','31dec94'd,'01jan95'd);
put year1;
year2 = intck('year','01jan94'd,'31dec94'd);
put year2;
* 6개월;
semi = intck('semiyear','01jan95'd,'01jan98'd);
put semi;
y = 'year';
date1 = '1sep1991'd;
date2 = '1sep2001'd;
newyears = intck(y,date1,date2);
put newyears;
run;
Results |
qtr year1 year2 semi y date1 date2 newyears
2 1 0 6 year 11566 15219 10
예 제 2 :
12월을 기준으로 2년의 구간을 카운트한다.
var3의 예는 2000년12월1일을 1, 2002년12월1일를 통해서 2값을 반환한다.
SAS Statements |
data INTCK;
var1 = intck('year2.12','01DEC2000'd,'01DEC2002'd);
var2 = intck('year2.12','30NOV2000'd,'30NOV2002'd);
var3 = intck('year2.12','30NOV2000'd,'01DEC2002'd);
put _all_;
run;
Results |
var1=1 var2=1 var3=2
SAS 함수(SAS Function) 리스트 링크 |
엑셀(EXCEL)과 SAS 함수(SAS Function) 비교 리스트 링크 |
SAS 데이터 스텝 구문 리스트(SAS Data Step Statement) |
'SAS > SAS 함수' 카테고리의 다른 글
【SAS 함수】 213. INTRR (0) | 2021.10.03 |
---|---|
【SAS 함수】 212. INTNX (0) | 2021.10.03 |
【SAS 함수】 210. INT (0) | 2021.10.03 |
【SAS 함수】 209. INPUTN (0) | 2021.10.03 |
【SAS 함수】 208. INPUTC (0) | 2021.10.03 |
댓글