본문 바로가기
데이터 전처리/R

날짜 데이터 전처리 [in R] -strptime,str_extract(),substr()

by JSMATH 2024. 5. 15.

https://pastryofjsmath.tistory.com/28

 

날짜,시간 데이터 전처리

*위의 파일을 이용하여 날짜와 시간 데이터 전처리하였습니다.import pandas as pdimport numpy as np#df_merged_mean = pd.read_csv('파일위치주소',encoding='UFT-8 또는 CP949')주소가 어디인지 모르시는 분들은 아래의

pastryofjsmath.tistory.com

위 파이썬 날짜,시간 데이터 전처리의 R버전입니다.

 

우선, R에서 날짜,시간 데이터 전처리 할 때 사용되는 함수는 as.Datestrptime이라는 함수입니다.

as.Date는 년,월,일만 나타내주며, strptime은 그 이하 년,월,일,시간,분,초까지 모두 반환해 줍니다.

기본적으로 파이썬에서 해본 format을 항상 맞춰준다는 생각을 가지고 있으면 됩니다.

 

df <- read.csv('',fileEncoding = 'CP949')
library(magrittr)
library(dplyr)

df

만약 as.Date로 한다면 년,월,일만 가능합니다.

as.Date(df$개강일 %>% as.character(),format='%y%m%d')
[1] "2024-04-19" "2024-04-18" "2024-04-18" "2024-04-19" "2024-04-19" "2024-04-18"

년,월,일만 있는 경우도 있지만 그 이하 시간,분을 사용하는 경우도 생깁니다. 

 

강의시작시간 컬럼의 format을 맞춰줍시다. %H%M의 형태를 맞춰줘야합니다. 저는 13:00, 10:30 처럼 맞춰주겠습니다.

df2<- gsub(pattern = '시',replacement = ':',x = df$강의시작시간)
df2
[1] "13:"     "10:30분" "12:"     "15:"     "14:"     "9:30"   

df2<- gsub(pattern = '분',replacement = '',x = df2)
df2
[1] "13:"   "10:30" "12:"   "15:"   "14:"   "9:30" 

df2 <- ifelse(nchar(df2) == 3, paste0(df2, "00"), df2)
df2
[1] "13:00" "10:30" "12:00" "15:00" "14:00" "9:30"

파이썬에서는 str.extract(r'(\d+시)') 같이 문자를 길이에 상관없이 추출이 가능했지만

제가 아직 모르는 것인지는 모르겠으나 R에서는 없는 것 같습니다;; 그래서 일반 양식을 맞춰주기 위해 코드 길이가 좀 길어졌습니다.

++20240610 

str.extract()와 같은 기능을 하는 코드를 찾았습니다.이 글 맨 밑에 서술해두었습니다. 그 코드를 보고 다음 글을 따라가세요.

 

# 시간 데이터를 POSIXct 형식으로 변환####
df2 <- strptime(df2, format = "%H:%M")
df2
[1] "2024-05-15 13:00:00 KST" "2024-05-15 10:30:00 KST" "2024-05-15 12:00:00 KST" "2024-05-15 15:00:00 KST"
[5] "2024-05-15 14:00:00 KST" "2024-05-15 09:30:00 KST"

#시간만 출력.
format(df2,format='%H:%M')
[1] "13:00" "10:30" "12:00" "15:00" "14:00" "09:30"

 

이제 개강일과 종강일도 strptime으로 나타내보겠습니다.

df$last_day <- strptime(df$종강일,format='%y년%m월%d일')
df$first_day <-strptime(df$개강일,format='%y%m%d')
df

그러면 위 last_day,first_day 데이터 구조는 어떻게 될까요?

Positxlt

우리가 자주 쓰는 문자형,숫자형,정수형,팩터형이 아닌 새로운 형태인 Positxlt으로 나타납니다.

이러한 형태는 파이썬에서 데이트형태처럼 일자끼리 뺄셈같은 연산이 가능합니다.

df$last_day-df$first_day
Time differences in days
[1] 72 72 73 70 72 72

 

++20240610

R에서 Python의 str.extract()과 같은기능을 하는 코드를 찾았습니다.

stringr패키지의 str_extract()입니다. 이 친구에 정규표현식을 같이 사용하면 똑같은 기능입니다.

library(stringr)
str_extract(df$강의시작시간,'\\d+시')

> str_extract(df$강의시작시간,'\\d+시')
[1] "13시" "10시" "12시" "15시" "14시" "9시" 

> str_extract(string = df$강의시작시간,pattern = '\\d+분')
[1] NA     "30분" NA     NA     NA     NA    

ifelse(test = is.na(str_extract(string = df$강의시작시간,pattern = '\\d+분')),yes = '00분',no=str_extract(string = df$강의시작시간,pattern = '\\d+분'))

> ifelse(test = is.na(str_extract(string = df$강의시작시간,pattern = '\\d+분')),yes = '00분',no=str_extract(string = df$강의시작시간,pattern = '\\d+분'))
[1] "00분" "30분" "00분" "00분" "00분" "00분"

 

추가적으로 python에서의 df[col].str[순서]와 같이 원하는 부분을 추출하는 기능이 있는데, R에서도 똑같은 기능을 구현한 코드가 있다.

str_extract(df$강의시작시간,'\\d+시')
str_extract(string = df$강의시작시간,pattern = '\\d+시')
str_extract(string = df$강의시작시간,pattern = '\\d+분')
start_time <- paste(str_extract(string = df$강의시작시간,pattern = '\\d+시'),ifelse(test = is.na(str_extract(string = df$강의시작시간,pattern = '\\d+분')),yes = '00분',no=str_extract(string = df$강의시작시간,pattern = '\\d+분')),sep = '')
start_time
강의시작시간<-format(strptime(start_time,format='%H시%M분'),format = '%H:%M')
substr(강의시작시간,start = 1,stop = 2)

> str_extract(df$강의시작시간,'\\d+시')
[1] "13시" "10시" "12시" "15시" "14시" "9시" 
> str_extract(string = df$강의시작시간,pattern = '\\d+시')
[1] "13시" "10시" "12시" "15시" "14시" "9시" 
> str_extract(string = df$강의시작시간,pattern = '\\d+분')
[1] NA     "30분" NA     NA     NA     NA    
> start_time <- paste(str_extract(string = df$강의시작시간,pattern = '\\d+시'),ifelse(test = is.na(str_extract(string = df$강의시작시간,pattern = '\\d+분')),yes = '00분',no=str_extract(string = df$강의시작시간,pattern = '\\d+분')),sep = '')
> start_time
[1] "13시00분" "10시30분" "12시00분" "15시00분" "14시00분" "9시00분" 
> 강의시작시간<-format(strptime(start_time,format='%H시%M분'),format = '%H:%M')
> substr(강의시작시간,start = 1,stop = 2)
[1] "13" "10" "12" "15" "14" "09"