R/강의복습

[22.08.18] 8일차 (날짜 / 시간 관련 데이터)

peach_h 2022. 8. 21. 18:22
☆ 강의 내용 요약 ☆

# Date 관련 함수들 
Sys.Date( ) : 오늘의 날짜를 알려주는 함수
as.Date(데이터, 입력한 데이터의 형태 ) : 문자열을 날짜 데이터로 전환해주는 함수 (시간은 무시한다)
  class : character -> Date
strptime(데이터, 입력한 데이터의 형태) :  문자열을 날짜, 시간 데이터로 바꿔주는 함수 (시간도 나옴)
  class : character -> Date
as.POSIXlt( ) /  as.POSIXct( ) : 날짜와 시간을 나타내는 함수
weekdays( ) : 지정한 날짜의 요일을 알려주는 함수
months( ) : 지정한 날짜의 달을 알려주는 함수
quarters( ) : 지정한 날짜의 분기를 알려주는 함수
unclass( ) : 1970년 1월 1일부터 지정한 날짜까지 며칠이 지났는지 계산해주는 함수
Sys.timezone( ) : 컴퓨터의 시간이 어느 지역의 시간인지 알 수 있는 함수

format(데이터, 원하는 데이터 형식) : 데이터를 원하는 형식으로 문자열로 출력해주는 함수
 class : ? -> character
cat( ) :print과 format과 같은 문자열을 출력하는 함수이다.
unclass( ) : class를 잠시 해제하고 벡터로 만드는 함수

# Date 관련 명령어 
%m : 월이 2자리로 나옴
%b : 월이 1자리로 나옴
%B : "월"이 숫자에 붙어서 나옴
%d : 날짜가 2자리로 나옴
%y / %Y : y가 소문자면 년도가 2자리로 나옴
%a : "월" "화" "수" 요일이 한글자만 나옴
%A : "월요일" "화요일" 요일이 3글자로 나옴

 

오늘 날짜 가져오기
# 오늘 날짜 가져오기 : Sys.Date()
today = Sys.Date()
today
str(today)
class(today)

Sys.Date() 함수를 이용해서 오늘 날짜를 가져올 수 있다.

데이터 타입은 Date 이다.

 

날짜 연산하기
t1 <- "2022-08-18"
t1
t1 <- t1 + 1 # 문자열에 연산해서 에러남

today = today + 1
# 내일로 넘어가있음 !
today

그냥 t1 변수에 날짜를 추가했을 경우, character 타입으로 연산이 불가능하다.

하지만 Sys.Date 함수로 날짜를 불러온 경우에는, 1을 더했을 경우 내일로 넘어가진다!

 

 

 

# format 함수 활용하기

 

** R 언어는 문자열에 숫자를 더할 수 없다.

컴퓨터의 시간은 1970년 1월 1일 00시부터 1씩 카운트 된 것으로, 내부적으로는 그냥 숫자다.

그렇기 때문에 출력 서식 지정이 가능하다.

# format : 문자열을 출력하는 함수. character로 나옴
today = Sys.Date()

# %Y = 년도를 4자리로 표현
s1 <- format(today, "%Y") 
s1
class(s1)

format() 함수로 문자열을 출력할 수 있다. 데이터가 character 타입으로 나온다.

 %Y : 년도를 4자리로 표현하는 명령어

 

 

# %m : 월 2자리 %d  :날짜 2자리
format(today, "%Y년 %m월 %d일") 

# y가 소문자면 년도가 2자리
format(today, "%y년 %m월 %d일") 

# %B = 월자체가 붙어있음
format(today, "%y년 %B %d일") 

# %a = 목
format(today, "%y년 %m월 %d일 %a") 

# %a = 목요일
format(today, "%y년 %m월 %d일 %A") 

format(today, "%Y-%m-%d-%a")
format(today, "%Y-%m-%d-%A")

%m : 월이 2자리로 나옴

%b : 월이 1자리로 나옴

%B : "월"이 숫자에 붙어서 나옴

%d : 날짜가 2자리로 나옴

%y / %Y : y가 소문자면 년도가 2자리로 나옴

%a : "월" "화" "수" 요일이 한글자만 나옴

%A : "월요일" "화요일" 요일이 3글자로 나옴

 

 

 

다양한 날짜 관련 함수
# 요일을 알려줌
weekdays(today) 

# 3일뒤에 무슨 요일?
weekdays(today+3)

# 달을 알려줌
months(today) 

# 분기를 알려줌
quarters(today) 

# 1970년 1월 1일부터 날짜수 센거
unclass(today)

weekdays( ) : 지정한 날짜의 요일을 알려주는 함수

months( ) : 지정한 날짜의 달을 알려주는 함수

quarters( ) : 지정한 날짜의 분기를 알려주는 함수

unclass( ) : 1970년 1월 1일부터 지정한 날짜까지 며칠이 지났는지 계산해주는 함수

 

 

 

as.Date  함수 활용하기
# 문자열을 날짜 형태로 전환하기
# as.Date 시간은 무시함
as.Date("2022/08/18")
as.Date("2022/08/18 17:03:21")
as.Date("2022년 08월 18일", "%Y년 %m월 %d일")

as.Date(데이터, 입력한 데이터의 형태 ) : 문자열을 날짜 데이터로 전환해주는 함수 (시간은 무시한다)

 

 

as.Date("1/8/2022", "%d/%b/%Y") # 일 : 2자리 / 달: 1자리 / 년 : 4자리
as.Date("160111", format="%y%m%d") # 년 : 2자리 / 달 : 2자리 / 일 : 2자리
as.Date("110228", format="%y%m%d") # 년 : 2자리 / 달 : 2자리 / 일 : 2자리
as.Date("11228", format="%d%b%y") # 일 : 2자리 / 달 : 1자리 / 년 : 2자리

숫자만 대충써도, format 함수를 같이 이용해 날짜 데이터로 추출할 수 있다.

 

 

x1 <-"2022-08-18 17:16:23"
class(x1)
d1 <- as.Date(x1, "%Y-%m-%d %H:%M:%S")
d1 +1
class(d1)

as.Date( ) 함수를 이용해 문자열을 Date 타입으로 바뀐 것을 확인 할 수 있다.

 

 

 

strptime 함수
t <- strptime(x1, "%Y-%m-%d %H:%M:%S")
t
class(t)

strptime(데이터, 입력한 데이터의 형태) :  문자열을 날짜, 시간 데이터로 바꿔주는 함수

 

 

 

 

POSIXlt와 POSIXct
as.Date(x1)
# 둘다 날짜와 시간까지 나타냄
as.POSIXct(x1)
as.POSIXlt(x1)

POSIXlt 와  POSIXct 타입이란 뭘까?

POSIXlt는 날짜와 시간을 나타내는데, 1900년에서 부터 지나온 날짜와 시간을 리스트 형태로 저장한다.

POSIXct는 1970년 1월 1일을 기준으로 타임존을 저장한다.

( 여기서 타임존은 시간의 기준이 되는 지역을 의미하는 듯 하다. )

결국 결과는 둘이 똑같이 나오는데, 무슨 차이인지 아직도 모르겠다..

 

 

 

POSIXlt 타입 연산하기
t <- strptime(x1, "%Y-%m-%d %H:%M:%S")
#POSIXIt 타입의 경우 1이 sec의 의미이다.
t <- t+1 
t

# 한시간 후
t <- t + 3600 
t

1 = 1sec으로 계산한다.

 

 

# 지금부터 두시간 이후
class(Sys.time())
Sys.time() + 3600*2

 

 

x1 <-"2022-08-18 17:16:23"
x2 <-"2022-08-19 02:32:23"
as.Date(x2) - as.Date(x1)
as.POSIXct(x2) - as.POSIXct(x1)
as.POSIXlt(x2) - as.POSIXlt(x1)

시간을 무시하는 as.Date는 두 날짜 사이의 일 수만 나타낸다.

보다 정확한 수치 값을 계산 할때는 POSIX 함수 들을 사용하는게 좋아보인다.

 

 

 

 

R은 국가를 컴퓨터의 OS에 따라 설정한다.
Sys.timezone()

Sys.timezone( ) : 컴퓨터의 시간이 어느 지역의 시간인지 알 수 있는 함수

 

 

 

 

lubridate 패키지 활용하기

lubridate는 날짜와 시간 처리를 담당하는 패키지이다. 

# 패키지 설치하기
install.packages("lubridate")
library(lubridate)

# 달의 마지막일
lubridate::ceiling_date(as.Date("2022/08/01"), unit="month")-1

**ceiling은 올림의 의미를 가진다. 반대로 내림은 floor가 있다.

8월 1일을 올려서 9월 1일이 된 후, -1하여 9월 1일의 전날을 구함으로 써 8월의 마지막일을 구할 수 있다.

 

 

 

이달의 말일 구하기
lubridate::ceiling_date(Sys.Date(), unit="month")-1

Sys.Date를 활용하여 이달의 말일을 구할 수 있다.

 

 

오늘부터 말일까지 며칠이 남았는지 구해보자
today = Sys.Date()
last = lubridate::ceiling_date(Sys.Date(), unit="month")-1
period =last - today
period

Sys.DateCeiling_Date를 이용하면 쉽게 구할 수 있다.

 

 

 

11만 나오게 하기
# 11만 나오게 하기
class(period)
unclass(period) # class 해제하기
period[1]
d<- unclass(period)
d[1] # print가 생략된거임

print(d[1])
cat("말일까지 남은 날짜는", d[1], "입니다")

unclass( ) : class를 잠시 해제하고 벡터로 만드는 함수

catprintformat과 같은 문자열을 출력하는 함수이다.

( d[1]과 print(d[1])은 같은 의미이다. r은 print를 생략할 수 있다. )

 

 

 

말일의 요일 구하기
weekdays(last)
cat(as.character(last), weekdays(last))

weekdays 함수에 last를 넣으면 말일의 요일을 알 수 있다 !

 

 

 

 

 

 

~ 오늘의 공부 후기 ~

실생활에 유용한 날짜와 시간에 관련된 함수들에 대해 배웠다 !
며칠에 무슨 요일인지 알려주는 weekdays 함수가 개인적으로 가장 유용할 것같다.
SPOSIX얘네는 아직도 먼차인지 모르겠다 ..

※ 사용한 교재 : 쉽게 배우는 R 데이터 분석 / 저자 : 김영우