POSIX
POSIX time
협정세계시(UTC)
그리니치 평균시(GMT)
Sys.Date()
Sys.time()
format()
as.Date()
strptime()
strftime()
lubridate 패키지
그리니치 평균시(GMT)
그리치치 평균시(이하 GMT)는 영국 런던에 위치한 그리니치 천문대를 기준으로 한 평균시이다.

그리니치 평균시는 지구의 자전에 따라 정의되었으며, 지구가 24시간 동안 자전하는 시간을 기준으로 하여 지역 시간을 계산한 것이다.
그러나 지구의 자전 속도가 불규칙적이며, 조금씩 변하고 있다는 문제점 때문에 그리니치 평균시로 정확한 시간 표준을 유지하기 어렵다는 문제가 발생하였다.
이로 인해 세계 협정시(UTC)라는 새로운 기준이 탄생하였다.
세계협정시(UTC)
세계협정시(이하 UTC)는 Coordinated Universal Time의 약자로, 1972년부터 시행된 국제 표준시이다.

세계 협정시는 세슘 원자시계를 사용하여 측정된다.
세슘 원자시계란 세슘 원자의 특정한 에너지 상태 전이를 통해 시간을 측정하는 시계이다.
1초의 정의는 세슘 원자의 진동수로 정의된다.
세슘 원자는 안정한 상태이기 때문에 매우 정확한 주기로 전이하기 때문에 정확한 계측이 가능하다.
그렇기 때문에 세슘 원자의 진동 전이할 때의 진동수가 91억 9263만 1770번 반복하는 시간의 길이가 매번 일정하고, 이 시간의 길이를 1초로 정의한 것이다.
이로 인해 세계 협정시는 그리니치 평균시가 가진 기준 정의의 불안정성을 해소할 수 있게 된 것이다.
그리니치 평균시와 세계 협정시를 알아보았으니, R에서 시간에 관한 함수들을 알아보도록 하자.
Sys.Date()
Sys.Date() 함수는 현재 날짜를 확인하는 기능을 가진다. 이 함수는 현재의 날짜 정보를 가져와 R의 날짜 형식으로 출력한다.
> Sys.Date()
[1] "2023-12-02"
이처럼 Sys.Date() (대소문자 구분 필수!) 는 현재 날짜에 대한 정보를 알려준다.
날짜에서 더 깊이 들어가, 현재 시간에 대한 정보도 얻고 싶다면 Sys.time() 함수를 사용해야 한다.
Sys.time()
Sys.time() 함수는 현재 날짜와 시간에 대한 정보를 모두 확인하는 기능을 가진다. 이 함수는 현재의 날짜와 시간에 대한 정보를 가져와 R의 날짜와 시간 형식으로 출력한다.
> Sys.time()
[1] "2023-12-02 07:30:42 UTC"
이처럼 Sys.time()은 현재 날짜와 시간에 대한 정보를 제공한다.
코드를 작성한 시간은 16:30분이지만, 왜 07:30:42 라는 시간을 출력할까?
이는 R에서 앞서 배운 UTC, 즉 세계 협정시를 기준으로 하여 출력하기 때문이다.
R이 제공하는 시간을 원하는 포맷대로 표시하려면 format()을 사용해야 한다.
format()
format은 Sys.Date() 함수가 출력하는 날짜를 원하는 포맷으로 출력하는 기능을 가지며 형식은 다음과 같다.
format(Sys.Date(), "%?-%?-%?")
format()에서 사용하는 옵션은 다음과 같다.
%Y | 년도를 4자리로 표기 |
%y | 년도를 2자리로 표기 |
%m | 월을 2자리로 표기 |
%d | 일을 2자리로 표기 |
%a | 요일을 한 글자로 표기 |
%A | 요일을 세 글자로 표기 |
%H | 시를 나타냄 |
%M | 분을 나타냄 |
%S | 초를 나타냄 |
(사용할 때는 뒤에 각각의 단위를 적어줘야 ~시~분으로 나옴!
R이 출력하는 "2023-12-02" 를 외국 음식의 유통기한 표시처럼 거꾸로 출력되게 만들어 보자.
(예시 기준: 2023년 12월 2일)
> format(Sys.Date(),"%d-%m-%Y")
[1] "02-12-2023"
%A를 사용하여 요일까지 추가해보자.
> format(Sys.Date(), "%A-%d-%m-%Y")
[1] "Saturday-02-12-2023"
(질문: Saturday로 출력되어 버리면 %A와 %a를 한 글자, 세 글자로 표기하는 것이 불가능한데, 특별한 코드 없이 패키지설치를 통해 한글로 출력하게 하는 방법이 있을까요? )
Sys.time()을 쓸 때 %H, %M, %S를 통해 시,분,초를 나타낼 수도 있다.
> format(Sys.time(), "%H시%M분%S초")
[1] "08시26분58초"
as.Date()
as.Date() 함수는 문자형 데이터를 날짜 형식으로 변환하는 기능을 가진다.
R에서 제공하는 시간 형식과 다른 형식으로 나타낸 날짜가 있을 때, 다른 형식에 대한 정보를 입력하면 R에서 제공하는 시간 형식으로 변환해주는 것이다.
형식은 다음과 같다.
as.Date('날짜','날짜 형식')
as.Date()를 사용할 땐 날짜의 포맷, 즉 형식에 대한 정보도 입력해야 한다.
<나쁜 예>
> as.Date('2023/12/02',"%Y%m%d")
[1] NA
'2023/12/02'의 형식과 달리 /를 넣지 않아서 제대로 출력되지 않았다.
<좋은 예>
> as.Date('2023/12/02',"%Y/%m/%d")
[1] "2023-12-02"
'2023/12/02'의 형식에 맞게 /를 삽입해 제대로 출력이 가능하게 만들었다.
strptime()
as.Date()는 날짜를 처리하는 기능이라면, strptime() 함수는 시간을 처리하는 기능을 가진다.
R에서 문자열을 날짜/시간 객체로 변화해주는 기능을 가지며, 특정 형식의 문자열을 날짜와 시간으로 파싱하여
R에서 처리할 수 있는 POSIXct 이나 POSIXlt 형식의 객체로 변환해준다.
형식은 다음 과 같다.
strptime('시간(날짜)','시간(날짜)형식')
예시는 다음과 같다.
> strptime('2023/12/02 18:06:57',"%Y/%m/%d %H:%M:%S")
[1] "2023-12-02 18:06:57 UTC"
기존에 /와 :라는 구분자로 나눠진 시간을 format() 형식에서 표시한 다음 strptime() 함수로 출력하면 R이 제공하는 시간 형식으로 변환되는 것이다.
strftime()
strftime() 함수는 strptime() 함수와 반대로, R에서 날짜와 시간 객체를 원하는 형식의 문자열로 변환해주는 기능을 가진다.
이 함수는 POSIXct 이나 POSIXlt 형식의 날짜/시간 객체를 문자열로 변환해준다.
strftime() 함수의 형식은 다음과 같다.
strftime('날짜','날짜 형식')
예시는 다음과 같다,
> strftime('2023-12-02 18:36:55',"%Y/%m/%d/ %H_%M_%S")
[1] "2023/12/02/ 18_36_55"
R에서 제공하는 형식에서 구분자를 가각 '/' 과 '_' 로 변환해주었다.