본문 바로가기
SAS

[SAS] SAS 숫자 날짜 변환 input, put, format 이용방법

by SASBIGDATA김진휘 2018. 10. 15.

이번 데이터 작업 내용은 input과 put 그리고 format을 활용하여 아주 유용하게 활용할 수 있는 방법이다.

가지고 있는 데이터가 숫자형 변수이면서 8자리인 생년월일을 가지고 있는 경우 이 숫자에 원하는 일수를 더하면 몇년 몇월 몇일이 나오는지가 궁금할 때 활용될수 있는 방법이다.


보건의료쪽에서 활용해 본다면 요양개시일이나 최초입원일자를 알고 있는 상황에서 재원일수 또는 입원일수 몇일을 더했을때 과연 요양종료일이나 최종퇴원일자를 구하고 싶을때 활용될수 있다. 일반적으로는 데이터에 요양종료일이라던지 퇴원일을 가지고 있겠지만 임의로 원하는 일수를 더하고 싶은 경우가 생길때 사용될수 있는 것이다.


이외에도 금융이나 보험또는 기념일 등 날짜에 원하는 일수를 추가해서 몇일이 되는지 다양하게 응용해서 사용할수 있다. 한두건이야 계산하겠지만 수천만 수억건에서 명령어 몇줄을 통해 각기 다른 날짜를 더해도 자동으로 기존 일자에서 추가된 일수를 구할수 있으니 자유롭게 응용이 가능하다.


오랜만에 글쓰니 횡설수설한데 아래의 예시를 보면 쉽게 이해할수 있고 응용해서 써먹을수 있을것이다.


SAS 프로그램을 통해 예제 데이터를 생성하여 시뮬레이션 해보자.


코딩)


data test;

input id$ start day;

cards;

1 19600101 14

2 20181012 5

3 20020202 45

;

run;


data test1;

set test;

check1=input(put(start,8.),yymmdd8.);

check2=check1+day;

format check2 yymmddn8.;

run;



결과)




코딩설명)

test라는 임시데이터셋을 생성한다.

변수는 총3개 문자형변수인 id와 숫자형변수인 start와 day를 생성한다.

관측값은 총 3개 id는 식별자이며 별의미 없고, start는 생년월일, day는 더하고 싶은 일수를 뜻한다.


test1 데이터셋 내용을 설명해보면 기존 생성하였던 test 데이터셋을 가져와서 check1이라는 변수를 만드는데 먼저 start가 숫자형변수이기 때문에 put함수를 사용하여 8자리 문자로 변형을 시켜준다. 그리고 input함수를 사용해 yymmdd8. 형식으로 날짜형 변수로 변환해 숫자로 표현한 값을 check1에 심는 것이다.

결과를 보면 check1 첫번째값이 0으로 나타난것을 볼수 있다. SAS에서는 날짜를 연산을 위해 숫자로 인식할때 1960년1월1일이 0이라는 숫자로 기준을 잡기 때문에 0으로 나타난 것이고, 그아래 21469는 2018년10월12일을 SAS가 인식하는 해당날짜에 대한 숫자이다. 그렇기 때문에 이 check1값에 day값을 더하여 check2변수값에 심어주는 것이다. 이렇게 되면 실제 첫번째 값은 check2는 0+14가 되므로 14라는 값을 가지게 될것이다. 그 아래값은 21469+5이므로 21474값이 될것이고 이렇게 연산의 과정이 생기게 된다.

그런데? 왜 check2의 결과는 날짜로 보여지는것인가? 코딩의 아래부분을 보면 format문을 사용했다. 이부분을 보면 날짜를 상징하는 SAS가 인식하는 숫자들이 연산된 결과가 check2가 가지고 있는데 format문을 이용해 check2값을 yymmddn8. 과 같은 날짜 형식으로 출력을 해달라라는 문장을 추가함으로써 최종적으로 check2변수의 값들이 날짜로 보여지는 것이다.


결과를 보면 첫번째 값은 1960년1월1일에서 14일을 더한값이 궁금했는데 check2결과로 1960년 1월 15일이 나왔고, 마지막 값또한 2002년 2월 2일에서 45일을 더한값이 2002년 3월 19일로 결과값이 나온것을 확인 할 수 있다.


정말 간단한 내용인데 자세히 쉽게 좀 풀어 써보려하니 글이 길어졌지만 지루해하지말고 천천히 읽어보면 쉽게 이해할 수 있을 것이다.


여기까지...ㅎ


www.sasbigdata.com 김진휘





댓글