ADsP R기초

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

날짜

날짜 객체를 쓰는 이유

날짜 객체는 말그대로 '2019-11-29'처럼 날짜 데이터를 담고 있는 객체입니다. 날짜 계산은 단순해보이지만 사실 매우 복잡합니다. 예를 들어 11월은 30일까지 있을까요, 아니면 31일까지 있을까요?  윤달이나 윤년은 언제일까요? 날짜 객체는 달력을 가지고 이 모든 걸 자동으로 계산해주기 때문에 편리합니다.

날짜 함수

날짜 객체는 보통 문자열을 변환해서 만듭니다. 형변환을 할 때 as. 함수를 쓴다는 걸 기억하고 계실까요?

#오늘 날짜를 불러오는 함수입니다.
> today <-  Sys.Date()
> today
[1] "2019-11-29"

문자열은 숫자를 더할 수 없습니다.
> "2019-11-29" + 1
Error in "2019-11-29" + 1 : non-numeric argument to binary operator

#하지만 날짜는 숫자처럼 더할 수도 있습니다.
> tomorrow <- today + 1
> tomorrow
[1] "2019-11-30"

#보통 문자열로 된 날짜를 날짜 객체로 변환합니다.
> as.Date("1995-07-21")
[1] "1995-07-21"

#미국식으로 적힌 문자열은 format 선택자를 이용합니다.
> birthDay <- as.Date("07/21/1995", format="%m/%d/%Y") 

#format함수는 날짜를 문자열로 바꿔줍니다. as.Date()와 반대입니다!
%a를 이용하면 요일을 알 수 있습니다.
> format(tomorrow, '%a')
[1] "토"
#더 복잡한 문자열도 가능합니다.
> format(today, '%Y-%m-%d(%a)')
[1] "2020-01-14(화)"

 

심화 : 날짜가 문자가 아니라 숫자라면... 몇 일까?

시험에는 안 나오지만 날짜 객체에 대해 더 자세히 알고 싶다면 봐주세요.

날짜 데이터를 숫자로 변환할 수 있습니다. as.numeric()함수를 쓰면 되는데요. 반대로 as.Date()를 쓰면 이 숫자를 다시 날짜로 바꿀 수 있습니다.

> as.numeric(Sys.Date())
[1] 18275
> as.Date(18275, origin=as.Date("1970-01-01"))
[1] "2020-01-14"

18275가 도대체 무슨 뜻일까요? 그 뜻은 바로 저 origin을 보면 알 수 있습니다. 이 값을 숫자로 바꾸면요...

> as.numeric(as.Date("1970-01-01"))
[1] 0

0이 뜹니다. 그 이유는 날짜 벡터는 겉보기에는 연월일처럼 보이지만... 사실은 1970년 1월 1일부터 며칠이 지났는지 세는 겁니다. 그걸 우리한테 보여줄 때는 컴퓨터 안에 있는 달력을 써서 1970년 1월 1일부터 18275일 후를 하나하나 세는 거죠.

그렇다면! 예를 들어 1970년 1월 7일은 숫자 몇일까요? 답을 바로 안다면 날짜 객체의 본질을 이해하신 겁니다. 정답을 모르겠다면 직접 실행해서 알아보세요.

> as.numeric(as.Date("1970-01-07"))

연습문제 날짜 벡터 다루기

빅데이터는 꽤 큽니다. 그래서 벡터를 가지고 한 번에 우르르 연산을 합니다. 이번에도 날짜 벡터를 가지고 문제를 풀어봅시다.

#여기 미국식으로 적힌 문자열 벡터 dates가 있습니다. 날짜 벡터로 다시 변환해보세요.
> days <-  1:10 + today
#format()함수를 써서 날짜 벡터를 문자열 벡터로 바꿉니다.
> dates <- format(days, '%m/%d/%Y')
> dates
 [1] "11/30/2019" "12/01/2019" "12/02/2019" "12/03/2019" "12/04/2019"
 [6] "12/05/2019" "12/06/2019" "12/07/2019" "12/08/2019" "12/09/2019"

#문자열로 된 dates객체를 다시 날짜 벡터로 변환해서 newDays에 저장해보세요.
> newDays <- ???

#newDays 가 무슨 요일인지 문자열 벡터를 만들어보세요. 결과는 다음처럼 나와야 합니다.
> ???
 [1] "토" "일" "월" "화" "수" "목" "금" "토" "일" "월"

댓글

댓글 본문
버전 관리
Taehee Kim
현재 버전
선택 버전
graphittie 자세히 보기