[R] R에서 날짜/시간 데이터 다루기 (feat. lubridate)

'15회 데이터 분석 전문가(ADP) 실기시험'에서 전처리 작업에 필요했던 날짜/시간 데이터를 처리하는 방법을 설명하는 글입니다.

0. 서론

15회 데이터 분석 전문가(ADP) 실기시험 2번 문제는 '데이터 처리 및 통계분석' 문제였습니다. 전력 사용량 데이터를 제공하면서 데이터 처리(변환, 병합, 요약 등)를 통해 목적에 맞는 분석을 수행하는 문제였고, 데이터는 시스템에서 생성된 로그 데이터가 제공되었습니다.

제공된 데이터를 처음 받았을 때 timestamp 컬럼에 처음보는 형식의 값이 들어있어 당황했었으나 저는 운좋게(?) 해결하게 되어 문제를 풀어나갈 수 있었습니다. 저처럼 당황하지 않으시길 바라며 해당 내용을 정리해 보았습니다. (핵심 내용은 길지 않습니다^^;)



Q) timestamp 컬럼에 들어있는 1543590900 값을 어떻게 변환할 것인가?


시험 종료 후 네이버 카페의 후기들을 보다보니 다른 능력자 분께서 1543590900는 "UNIX시스템에서 사용하는 timestamp 형식이다" 라는 힌트를 주셨고, 추가로 찾아보니 아래와 같이 timestamp를 변환해 볼 수 있는 사이트도 있었습니다.

Epoch Unix Time Stamp Converter
▲ Epoch Unix Time Stamp Converter

1. 실기 기출 문제 및 데이터

데이터

  • timestamp 처리 / date 기준 데이터 병합
  • hh:mm, A/B/C/D/E, 전력 사용량 데이터
  • yyyymmdd, 평균 기온

문제

  1. 아래 형태의 데이터 생성 : 3개 데이터를 date기준으로 병합 필요
    • yyyy-mm / A / B / C / D / E / 사용량
  2. 요일 변수 생성 및 A/B/C/D/E별 평균 사용량 출력, 그래프 출력
  3. 요일간 사용량 분석을 수행하고 가장 차이가 있는 요일 도출
  4. (문제가 생각이 안나네요.. ㅠㅠ)

출처 : 데이터분석전문가(ADP) 15회 실기시험 후기

2. 문제 풀이

제공된 데이터는 총 3개의 파일로 나누어져 있었고, timestamp를 기준으로 병합이 필요했습니다. 기준 파일이었던 첫 번째 파일에는 timestamp 컬럼에 1543590900 과 같은 형식의 값이 들어있었고 저뿐만 아니라 다른 응시자들분들도 당황하셨던 걸로 기억합니다.(시험지를 받고 응시자분들의 질문이 많았습니다. ㅎㅎ)

저는 평소 R을 사용하면서 날짜/시간 데이터 처리에는 lubridate 패키지가 만능! 으로 생각하고 있었기에 막연하게 패키지를 로드하여 변환을 시도하였습니다. ?help로 내장 함수들을 살펴보던 중 as_datetime() 함수를 발견하고 적용하여 쉽게 변환(얻어 걸렸...) 할 수 있었습니다.

패키지 로드 및 timestamp 변환

library(lubridate)

as_datetime(1543590900)
# [1] "2018-11-30 15:15:00 UTC"

위 결과와 같이 1543590900 값을 일반적인 날짜 형식인 2018-11-30 15:15:00 UTC으로 변환할 수 있으며, 이를 기반으로 시간(hh:mm)과 연월일(YYYYMMDD) 정보를 분리하여 새로운 컬럼 생성 및 추가 분석을 진행할 수 있습니다.

아래는 샘플 데이터를 생성하여 UNIX 날짜 형식 변환 후, 연도 및 시간을 분리해 내는 예제 입니다.

먼저 UNIX 날짜 형식을 가진 dt변수를 생성해 보겠습니다.

dt <- data.frame(timestamp = c(1543590900, 1543591000, 1543591100),
                 A = c(4, 5, 6),
                 B = c(10, 30, 70),
                 C = c(6, 1, 7))

dt
#    timestamp A  B C
# 1 1543590900 4 10 6
# 2 1543591000 5 30 1
# 3 1543591100 6 70 7

생성된 dt변수에서 UNIX 날짜 형식을 따르는timestamp 컬럼을 변환하고 '연월일', '시분'을 분리해 보겠습니다.

  • datetime : timestamp를 일반 날짜 형식으로 변환한 값
  • yyyymmdd : datetime에서 연월일(YYYYMMDD)을 추출한 값
  • hhmm : datetime에서 시분(HHMM)을 추출한 값
dt$datetime <- as_datetime(dt$timestamp)
dt$yyyymmdd <- format(dt$datetime, "%Y%m%d")
dt$hhmm <- format(dt$datetime, "%H%M")

#    timestamp A  B C            datetime yyyymmdd hhmm
# 1 1543590900 4 10 6 2018-11-30 15:15:00 20181130 1515
# 2 1543591000 5 30 1 2018-11-30 15:16:40 20181130 1516
# 3 1543591100 6 70 7 2018-11-30 15:18:20 20181130 1518

위와 같이 정상적으로 날짜 데이터 변환 및 추출이 완료된 것을 확인할 수 있었습니다. lubridate 패키지는 위에서 소개드린 간단한 날짜 처리 외에도 다양한 함수를 추가 제공하고 있으니 다양한 연습을 통해 익숙해 지시면 더욱 좋을 것 같습니다.

3. lubridate 함수 사용법

  • 연도(year) 추출
year(dt)
# [1] 2018
  • 월(month) 추출
month(dt)
# [1] 11
  • 일자(day) 추출
day(dt)
# [1] 30
  • 시간(hour) 추출
hour(dt)
# [1] 15
  • 분(minute) 추출
minute(dt)
# [1] 15
  • 초(second) 추출
second(dt)
# [1] 0
  • 요일(day of the week) 추출
wday(dt, label=T)
# [1] 금
# Levels: 일 < 월 < 화 < 수 < 목 < 금 < 토
  • 현재 timestamp 출력
now()
# [1] "2020-07-21 13:45:40 KST"

4. lubridate 컨닝 페이퍼

'lubridate' 공식 페이지 에서는 활용을 위한 '컨닝 페이퍼(Cheat Sheet)'을 제공하고 있습니다. ADP 실기 응시하시는 분이라면 아래 PDF 파일을 인쇄하여 시험에 가져가시는 걸 추천 드립니다.

lubridate.pdf
968.2 kB

lubridate Cheat Sheet in R
▲ lubridate Cheat Sheet-1

lubridate Cheat Sheet in R
▲ lubridate Cheat Sheet-2

5. 관련 링크

[1] https://lubridate.tidyverse.org/
[2] Data-Time Conversion Function in R
[3] Do more with dates and times in R
[4] Woking with Dates and Times with lubridate in R
[5] R에서 깔끔하게 날짜·시간 데이터 처리하기(feat.lubridate)
[6] R에서 lubridate package 에 대해


banner-request-analysis