'15회 데이터 분석 전문가(ADP) 실기시험'에서 전처리 작업에 필요했던 날짜/시간 데이터를 처리하는 방법을 설명하는 글입니다.
0. 서론
15회 데이터 분석 전문가(ADP) 실기시험 2번 문제는 '데이터 처리 및 통계분석' 문제였습니다. 전력 사용량 데이터를 제공하면서 데이터 처리(변환, 병합, 요약 등)를 통해 목적에 맞는 분석을 수행하는 문제였고, 데이터는 시스템에서 생성된 로그 데이터가 제공되었습니다.
제공된 데이터를 처음 받았을 때 timestamp
컬럼에 처음보는 형식의 값이 들어있어 당황했었으나 저는 운좋게(?) 해결하게 되어 문제를 풀어나갈 수 있었습니다. 저처럼 당황하지 않으시길 바라며 해당 내용을 정리해 보았습니다. (핵심 내용은 길지 않습니다^^;)
Q) timestamp
컬럼에 들어있는 1543590900
값을 어떻게 변환할 것인가?
시험 종료 후 네이버 카페의 후기들을 보다보니 다른 능력자 분께서 1543590900
는 "UNIX시스템에서 사용하는 timestamp 형식이다" 라는 힌트를 주셨고, 추가로 찾아보니 아래와 같이 timestamp
를 변환해 볼 수 있는 사이트도 있었습니다.
1. 실기 기출 문제 및 데이터
데이터
- timestamp 처리 / date 기준 데이터 병합
- hh:mm, A/B/C/D/E, 전력 사용량 데이터
- yyyymmdd, 평균 기온
문제
- 아래 형태의 데이터 생성 : 3개 데이터를 date기준으로 병합 필요
- yyyy-mm / A / B / C / D / E / 사용량
- 요일 변수 생성 및 A/B/C/D/E별 평균 사용량 출력, 그래프 출력
- 요일간 사용량 분석을 수행하고 가장 차이가 있는 요일 도출
- (문제가 생각이 안나네요.. ㅠㅠ)
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 파일을 인쇄하여 시험에 가져가시는 걸 추천 드립니다.
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 에 대해