시간형 자료를 lubridate로 관리하기

2019.05.06 21:30R/Basic

as.Date보다 손쉽게 시간형 데이터를 관리할 수 있는 패키지다 

기본 포맷 

## 시간형을 선언하지 않으면 문자열로 인식한다
> '2019-05-06' %>% str
 chr "2019-05-06"
 
## as.Date로 시간형으로 선언할 수 있다.
> as.Date('2019-05-06') %>% str
 Date[1:1], format: "2019-05-06"
 
## 형식을 지키지 않으면 시간으로 인식하지 못한다
> as.Date('20190506')
Error in charToDate(x) : 문자열이 표준서식을 따르지 않습니다

## 순서를 변경해도 인식하지 못한다
> as.Date('05-06-2019')
[1] "0005-06-20"

lubridate는 형식에 구애받지 않고, 사람이 일반적으로 상상할 수 있는 다양한 형식으로 입력한 데이터를 시간 데이터로 인식한다.

library(lubridate)

## yyyy-mm-dd
> ymd('2019-05-06')
[1] "2019-05-06"

## mm-dd-yyyy
> mdy('05/06/2019')
[1] "2019-05-06"

## dd-mm-yyyy
> dmy('06/05/2019')
[1] "2019-05-06"

세계에는 다양한 날짜 기입 방법이 있다. 연-월-일 / 월-일-연 / 일-월-연의 형식만 ymd, mdy, dmy로 지정해 주면 r이 알아서 데이터를 인식하여 표시해준다.

## yyyy-mm-dd hh:mm:ss
> ymd_hms('2019-05-06 05:23:22')
[1] "2019-05-06 05:23:22 UTC"

## yyyy-mm-dd hh:mm
> ymd_hm('2019-05-06 05:22')
[1] "2019-05-06 05:22:00 UTC"

## yyyy-mm-dd hh
> ymd_h('2019.05.06 05')
[1] "2019-05-06 05:00:00 UTC"

as.POXITct 보다 훨씬 유연하기 때문에 사용하기 편하다.

시간 정보 추출

셀에서 특정 시간 정보를 추출하는 방법은 아래와 같다 

## 시간 정보 선택
time = ymd_hms('2019.05.06 05:33:22')
time

lub.time = matrix(nrow = 1, ncol = 8) %>% as.tibble %>% 
  rename(year = V1, month = V2, day = V3, wday = V4, yday = V5, hour = V6, min = V7, sec = V8)

lub.time$year = year(time)
lub.time$month = month(time)
lub.time$day = day(time)
lub.time$wday = wday(time)
lub.time$yday = yday(time)
lub.time$hour = hour(time)
lub.time$min = minute(time)
lub.time$sec = second(time)

시간 정보 연산

 
## 시간 정보 연산 
> ymd('2018.12.31') + 1
[1] "2019-01-01"

> ymd('2019.2.28') + 1
[1] "2019-03-01"

> ymd('2019.05.06') - 100
[1] "2019-01-26"

lubridate로 입력된 시간정보는 자유롭게 날짜와 시간을 더하고 뺄 수 있다

범위 형태로 날짜의 행렬을 반환 받을 수도 있다

ymd('2019.05.1') + days(0:30)

LA Lakers 데이터셋을 활용한 실습

lakers는 2008-2009 시즌 동안 LA 레이커스팀의 득점 데이터를 기록한 데이터다

lubridate 패키지 함수를 사용하여 아래 작업을 할 것이다

  • 날짜와 시간 데이터를 하나로 합침 

  • 월별로 슛의 종류 별 득점의 합

time.ex = lakers %>% as.tibble
time.merged = time.ex %>% mutate(time.stmp = ymd_hm(paste(date, time))) %>% 
  select(time.stmp, everything()) %>% select(-date, -time) %>% na.omit()
time.merged

시간 정보가 하나로 합쳐진 것을 알 수 있다. 이제 시간에서 월 정보를 추출한 후 그룹 정렬과 요약을 할 것이다

lakers.shoot = time.merged %>% group_by(month(time.stmp), type) %>% 
  filter(points != 0) %>% 
  summarise(sum.point = sum(points)) %>% rename(month = 'month(time.stmp)')
str(lakers.shoot)
lakers.shoot$month = as.factor(lakers.shoot$month)
lakers.shoot$type = as.factor(lakers.shoot$type)
lakers.shoot

 

 
lakers.shoot %>% ggplot() + geom_col(aes(x = month, y = sum.point, fill = type))

특정 기간 동안의 데이터를 lubridate로 검색하기

serch.term = interval(ymd_hms('2009-01-02 00:00:00'), ymd_hms('2009-01-31 23:59:59'))
time.merged %>% filter(time.stmp %within% serch.term)

 

'R > Basic' 카테고리의 다른 글

시간형 자료를 lubridate로 관리하기  (0) 2019.05.06
ggmap으로 지도에 표시하기  (0) 2019.05.06
Tidyr의 gather와 spread  (0) 2019.04.29
데이터를 클립보드에 읽고 쓰기  (0) 2019.04.28
폴더에서 파일 리스트 가져오기  (0) 2019.04.27
정규 표현식  (0) 2019.04.22