[R] 6. 날짜 및 시간 변수 (lubridate)

반응형

날짜 및 시간 변수

  • 분석가들은 종종 시계열 데이터를 다룰때도 있습니다.
  • 이번 포스팅에서는 날짜, 시간 변수를 다루는 방법에 대해서 살펴보겠습니다.
  • 날짜 및 시간 변수는 표기하는 방법이 매우 다양하며 타임존(time-zone) 또한 늘 따라다니므로 항상 염두해두고 분석하셔야 합니다.
  • 아래 가상으로 만든 데이터로 확인해보겠습니다.
temp <- tibble(
  song_id = sample(x = c("a", "b", "c"), size = 100, replace = TRUE),
  start_ts = sample(
    x = seq(from = as.POSIXct("2021-07-01 18:00:00 KST"), to = as.POSIXct("2021-07-06 23:59:59 KST"), by = 1),
    size = 100,
    replace = TRUE
  )
)

temp
## # A tibble: 100 x 2
##    song_id start_ts           
##    <chr>   <dttm>             
##  1 c       2021-07-03 18:24:01
##  2 c       2021-07-04 03:07:37
##  3 c       2021-07-03 15:23:20
##  4 b       2021-07-05 02:47:22
##  5 b       2021-07-02 16:15:41
##  6 b       2021-07-04 08:25:43
##  7 c       2021-07-05 00:48:46
##  8 b       2021-07-04 21:01:22
##  9 a       2021-07-04 01:02:35
## 10 a       2021-07-03 21:24:09
## # … with 90 more rows
  • as.POSIXct() 함수는 문자형 객체를 time zone 까지 고려한 time stamp 형식으로 데이터 타입을 변환시켜주는 함수이며
    그 결과 tibble에서 해당 변수는 <dttm> 형태를 가지고 있는 것을 확인할 수 있습니다.



  • 위와 같이 날짜 및 시간으로 구성되어 있는 변수들에서 ‘년’, ‘월’, ‘일’, ‘시’, ‘분’, ’초’에 해당 되는 내용을 따로 추출하는 함수는 lubridate 라이브러리에 내장되어 있는 함수들로 아래와 같습니다. (<dttm> 형태의 변수를 처리하기 위해서 lubridate 라이브러리가 필요합니다.)
추출요소 함수명
year()
month()
day()
hour()
minute()
second()
library(lubridate)
# timestamp에서 각 요소를 추출하는 함수를 이용한 결과
temp %>% 
  mutate(
    ts_year = year(start_ts),
    ts_month = month(start_ts),
    ts_day = day(start_ts),
    ts_hour = hour(start_ts),
    ts_minute = minute(start_ts),
    ts_second = second(start_ts)
  ) 
## # A tibble: 100 x 8
##    song_id start_ts            ts_year ts_month ts_day ts_hour ts_minute
##    <chr>   <dttm>                <dbl>    <dbl>  <int>   <int>     <int>
##  1 c       2021-07-03 18:24:01    2021        7      3      18        24
##  2 c       2021-07-04 03:07:37    2021        7      4       3         7
##  3 c       2021-07-03 15:23:20    2021        7      3      15        23
##  4 b       2021-07-05 02:47:22    2021        7      5       2        47
##  5 b       2021-07-02 16:15:41    2021        7      2      16        15
##  6 b       2021-07-04 08:25:43    2021        7      4       8        25
##  7 c       2021-07-05 00:48:46    2021        7      5       0        48
##  8 b       2021-07-04 21:01:22    2021        7      4      21         1
##  9 a       2021-07-04 01:02:35    2021        7      4       1         2
## 10 a       2021-07-03 21:24:09    2021        7      3      21        24
## # … with 90 more rows, and 1 more variable: ts_second <dbl>
  • timestamp의 각 요소들을 뽑아 이를 활용하여 수치적 연산을 할 경우에 이를 as.double() 더블형 또는 as.integer() 정수형으로 바꿔 적용하는 것이 좋습니다.



  • make_datetime() 함수를 이용하여 새로운 변수를 생성할 수도 있습니다. 괄호 안에 들어간 input 요소는 년, 월, 일, 시, 분, 초 순입니다.
# make_datetime() 함수를 이용하여 new_generate_ts 변수 생성
temp %>% 
  mutate(
    ts_year = year(start_ts),
    ts_month = month(start_ts),
    ts_day = day(start_ts),
    ts_hour = hour(start_ts),
    ts_minute = minute(start_ts),
    ts_second = second(start_ts)
  ) %>% 
  mutate(
    new_generate_ts = make_datetime(ts_year, ts_month, ts_day, ts_hour, ts_minute, ts_second)
  ) %>% 
  select(start_ts, new_generate_ts)
## # A tibble: 100 x 2
##    start_ts            new_generate_ts    
##    <dttm>              <dttm>             
##  1 2021-07-03 18:24:01 2021-07-03 18:24:01
##  2 2021-07-04 03:07:37 2021-07-04 03:07:37
##  3 2021-07-03 15:23:20 2021-07-03 15:23:20
##  4 2021-07-05 02:47:22 2021-07-05 02:47:22
##  5 2021-07-02 16:15:41 2021-07-02 16:15:41
##  6 2021-07-04 08:25:43 2021-07-04 08:25:43
##  7 2021-07-05 00:48:46 2021-07-05 00:48:46
##  8 2021-07-04 21:01:22 2021-07-04 21:01:22
##  9 2021-07-04 01:02:35 2021-07-04 01:02:35
## 10 2021-07-03 21:24:09 2021-07-03 21:24:09
## # … with 90 more rows
  • <참고> as_datetime() 함수로 일반 문자열을 <dttm> 포맷으로 변환시킬 수 있습니다.
# as_datetime() 함수 사용
as_datetime("2021-07-01 18:32:51", tz = "Asia/Seoul")
## [1] "2021-07-01 18:32:51 KST"



  • 시간 및 날짜 변수를 가지고 그 시간 간격 차이를 구할 수도 있습니다.
  • SQL DATE_DIFF(‘SECOND’, 컬럼1, 컬럼2) 함수와 동일하다고 생각하시면 됩니다.
x <- as_datetime("2021-07-01 18:00:00", tz = "Asia/Seoul")
y <- as_datetime("2021-07-01 18:59:59", tz = "Asia/Seoul")
y - x
## Time difference of 59.98333 mins
  • 이는 R 기본 내장함수인 difftime과 동일합니다.
difftime(y, x, units = "mins")
## Time difference of 59.98333 mins
반응형
TAGS.

Comments