R에서 시각 데이터 처리

R은 날짜 시각 데이터를 아주 편리하게 처리할 수 있도록 POSIXlt와 POSIXct 클래스를 두고 있습니다. POSIX (Portable Operating System Interfaces: 포직스)는 UNIX 간 소통 가능한 프로그램 인터페이스의 규약입니다. 뒤에 있는 "lt"는 list time, "ct"는 continuous time이고 우리가 주로 다룰 것은 lt입니다. 정리하면 POSIX + lt -> POSIXlt, POSIX + ct -> POSIXct 이렇습니다.

> Sys.time()
[1] "2014-12-24 11:32:53 KST"
> as.numeric(Sys.time())
[1] 1419388383

 현재 시각을 출력했고, 이를 1970년 1월 1일 기준, 초 단위로 변경하였습니다.

> class(Sys.time())
[1] "POSIXct" "POSIXt"

클래스를 보면 POSIXt라고 나올텐데 POSIXlt를 의미합니다. ㅋㅋ

> time.list <- as.POSIXlt(Sys.time())
> unlist(time.list)
      sec       min      hour      mday       mon      year      wday      yday     isdst
 58.80141  33.00000  11.00000  24.00000  11.00000 114.00000   3.00000 357.00000   0.00000

POSIXlt의 내용을 살펴보면
  • sec : 그냥 초
  • min : 그냥 분
  • hour : 그냥 시간
  • mday: 1일을 1로
  • mon: 1월을 0으로
  • year : 1900년을 0으로
  • wday: 일요일이 0으로
  • yday : 1월 1일이 0으로
  • isdst : 서머타임
> x <- c(3,1,6,7,8,9)
> date <- c('15/06/2014','16/06/2014','17/06/2014','18/06/2014','19/06/2014','20/06/2014')
> data <- data.frame(x,date)
> data
> rm(x)

이렇게 데이터를 준비하고

> Rdate <- strptime(as.character(date),'%d/%m/%Y')
> # 2014-12-24 16:45:50 Wed -> %Y-%m-%d %H:%M:%S %a
> # 2014-12-24 16:45:50 Wednesday -> %Y-%m-%d %H:%M:%S %A
> # 24 Dec 2014 -> %d %b %Y
> # 24 December 2014 -> %d %B %Y
> # PM 2:35 -> %p %I:%M

strptime으로 문자를 POSIXlt 형변환합니다.
위를 보면 변환식 규칙이 몇 가지 나와 있습니다.

> tapply(data$x,Rdate$wday,mean)
> #요일별 평균

날짜 간 차이는 difftime 클래스를 알아야 합니다.

> difftime("2014-02-06","2014-07-06")
> round(difftime("2014-02-06","2014-07-06"),0)
> a <- difftime("2014-02-06","2014-07-06")
> as.numeric(a, units="hours")
> as.numeric(a, units="days")
> as.numeric(a, units="secs")
> as.numeric(a, units="mins")

위의 예처럼 difftime 클래스를 생성하기는 쉽지요.

시각 차이를 알려면?
> t1 <- as.difftime('6:14:21')
> t2 <- as.difftime('5:12:32')
> a <- t1 - t2
> as.numeric(a, units='secs')

as.difftime으로 변환하면 시간 단위의 산술형으로 변환하여 시간 구간 별 차이를 쉽게 구할 수 있습니다.


물론 POSIXlt 클래스를 그냥 산술해도 됩니다.
> y1 <- as.POSIXlt('2015-10-22')
> y2 <- as.POSIXlt('2018-10-22')
> y1 - y2
> y2 - y1


댓글

이 블로그의 인기 게시물

R에서 csv 파일 읽는 법

xlwings tutorial - 데이터 계산하여 붙여 넣기