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

2019. 5. 6. 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' 카테고리의 다른 글

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