지난번에 이어 또 날짜와 관련된 게시물을 올리게 되는군요. 오늘은 특정한 년, 월의 총 일수(number of days)를 산출하는 방법에 대해서 언급을 하고자 합니다. 그리고 이러한 값을 얻을 수 있도록 해주는 간단한 함수 프로그램도 함께 올립니다.
다들 아시다시피 특정한 년, 월의 일수는 매번 다릅니다. 10월이면 31, 11월이면 30, 12월이면 31 등이 되는 것은 항상 고정적이기 때문에 상관이 없는데, 문제는 2월이죠. 윤년이 걸리는 경우도 있고 다른 예외적인 경우도 있어서 28 또는 29일이 되기도 합니다. 그러면 이렇게 매번 다른 일수를 구하려면 어떻게 해야 할까요? 열쇠는 TIMEGEN 및 JULDAY라는 내장함수들이 쥐고 있습니다. 결론부터 언급하면, 이 두 함수를 아래와 같은 방법으로 사용하면 됩니다.
days = TIMEGEN(START=JULDAY(month, 1, year), FINAL=JULDAY(month+1, 1, year), UNIT='days')
nd = N_ELEMENTS(days)-1
TIMEGEN 함수의 역할은 특정한 시작 시기 및 끝 시기 사이의 날짜 구간에 대하여 내가 원하는 단위에 해당되는 날짜 스텝들을 돌려줍니다. 시작 및 끝 시기는 START 및 FINAL 키워드에 Julian Day 형태로 들어가야 합니다. 그리고 기본 단위는 UNIT이라는 키워드에 넣어주면 됩니다. 예를 들어서 2014년 10월 1일부터 15일까지의 구간에 속하는 날짜들을 1일 간격으로 얻으려면 다음과 같이 해주면 됩니다.
results = TIMEGEN(START=JULDAY(10, 1, 2014), FINAL=JULDAY(10, 15, 2014), UNIT='days')
물론 이 결과는 Julian Day 형태의 값들 15개가 담긴 배열로 돌아옵니다. 따라서 우리가 눈으로 식별하기 쉬운 날짜 형태로 만들려면 제가 어제 올렸던 게시물의 내용에서 STRING 함수에 들어간 FORMAT의 내용을 참조하면 됩니다. 어쨌든 이것은 TIMEGEN 함수의 기본적인 사용 예제였고요. 위의 내용에 있는 days의 경우도 비슷합니다. 다만 시작과 끝에 해당되는 날짜, 특히 끝에 해당되는 날짜에서 월에 1을 더한 것이 눈에 띕니다. 즉 내가 구하고자 하는 월의 1일부터 그 다음 월의 1일까지의 일(day)들을 TIMEGEN 함수로 뽑아내고 그 갯수를 세는 방식임을 알 수 있습니다.
물론 여기서 이런 질문 나올 수 있습니다. 위의 내용에서 month의 값이 12라면 month+1은 13이 되지 않겠냐 이거죠. 이건 걱정안하셔도 됩니다. 그냥 IDL이 알아서 1월로 간주하고 처리를 합니다. 하여간 이런 방법을 쓰면 어떤 년, 월이 되더라도 일수를 쉽게 구할 수 있습니다. 제가 위의 내용을 담아서 만든 함수 프로그램을 함께 올립니다. 이 함수의 이름은 GET_DAYS_IN_MONTH입니다. 사용법은 아래와 같습니다. 예를 들어, 2014년 2월의 일수를 얻고 싶은 경우입니다.
IDL> print, GET_DAYS_IN_MONTH(2014, 2)
28
사실 IDL 자체에 이런 역할을 하는 함수가 내장되어 있지는 않기 때문에, 제가 올린 이 함수가 여러분께 도움이 되었으면 합니다. 파일은 아래 링크에 있습니다.
'IDL > Programming' 카테고리의 다른 글
| 새로운 배열 생성 방법 소개 (0) | 2015.01.30 |
|---|---|
| WHERE 함수의 결과가 단 하나일 경우의 유의사항 (0) | 2015.01.05 |
| 날짜 문자열 갖고 놀기 [1] (0) | 2014.10.16 |
| 함수(Function)에서 여러 개의 값들을 한꺼번에 되돌려주는 방법 (0) | 2014.09.11 |
| 배열내에서 N번째로 가장 작은(또는 큰) 원소값 찾기 (0) | 2014.08.06 |