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의 내용을 살펴보면
> 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
> 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 : 서머타임
> 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
댓글
댓글 쓰기