[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
반응형
'tidyverse' 카테고리의 다른 글
[R] 8. 데이터 합치기 (join) (0) | 2021.07.05 |
---|---|
[R] 7. 데이터 형태 변환 (0) | 2021.07.05 |
[R] 5. mutate() (0) | 2021.07.05 |
[R] 4. select(), filter(), group_by(), summarise(), arrange(), rename() (0) | 2021.07.05 |
[R] 3. 파이프 오퍼레이터 (%>%) (0) | 2021.07.05 |
TAGS.