Trong xử lý dữ liệu chuỗi thời gian chúng ta thường bắt gặp vấn đề convert dữ liệu dạng text sang các định dạng date phù hợp để có thể đánh index cho các timeseries object. Vì thế việc nắm rõ cách thức convert, các kiểu định dạng thời gian trong R sẽ giúp ta chuyển hóa linh hoạt dữ liệu và tạo các object chuỗi thời gian chuẩn xác.

I. Hàm as.Date trong convert date

Để chuyển hóa một dữ liệu từ text sang date chúng ta sử dụng hàm có cú phát như sau:

as.Date(vector_date)

trong đó vector_date là vector chứa các phần tử date dạng text.

Giả sử chúng ta có một vector date như sau

vt_date <- c("2017-09-13","2017-09-12")
vt_date[1]-vt_date[2]
## Error in vt_date[1] - vt_date[2]: non-numeric argument to binary operator

Phép toán sẽ bị lỗi do đang ở dạng text. Sử dụng hàm as.Date để convert sang dạng date và thực hiện phép toán như thông thường.

vt_date <- c("2017-09-13","2017-09-12")
datetime <- as.Date(vt_date)
datetime[1] - datetime[2]
## Time difference of 1 days

Bên cạnh đó ta có thể convert các định dạng date khác nữa

vt_date <- c("2017/09/13","2017/09/12")
as.Date(vt_date)
## [1] "2017-09-13" "2017-09-12"

Tuy nhiên định dạng này sẽ chỉ mặc định là yyyy/mm/dd. Nếu ta đảo lộn lại vị trí của month sang day thì hàm convert sẽ bị lỗi do không có tháng 13.

vt_date <- c("2017/13/09","2017/12/09")
as.Date(vt_date)
## Error in charToDate(x): character string is not in a standard unambiguous format

Để ̣convert định dạng dạng yyyy/dd/mm trong trường hợp trên ta phải ép kiểu cho as.Date

vt_date <- c("2017/13/09","2017/12/09")
as.Date(vt_date,"%Y/%d/%m")
## [1] "2017-09-13" "2017-09-12"

Sau khi ép kiểu, hàm as.Date sẽ hiểu là định dạng ban đầu kiểu yyyy/dd/mm chứ không phải như thông lệ là yyyy/mm/dd và điều này giúp date được convert đúng. Trong mọi tình huống Khánh recommend mọi người nên ép kiểu cho date khi sử dụng hàm as.Date để R không convert lỗi.

Vậy những kí hiệu nào sẽ định dạng cho các thành phần trong Date. Trong ngôn ngữ R sẽ có một số khác biệt so với các ngôn ngữ lập trình khác. Chúng ta sẽ tìm hiểu ở chương sau

II. Format Date trong R

Những kí hiệu sau đây sẽ được dùng để format kiểu của date trong R

Symbols <- c("%d","%a","%A","%m","%b","%B","%y","%Y")
Meaning <- c("day as a number (0-31)","abbreviated weekday","unabbreviated weekday",
             "month (00-12)","abbreviated month","unabbreviated month","2-digit year","4-digit year")
Example <- c("01-31","Mon","Monday","00-12","Jan","December","17","2017")
writeLines("td, th { padding : 6px } th { background-color : brown ; color : white; border : 1px solid white; } td { color : brown ; border : 1px solid brown }", con = "mystyle.css")
dfDateFormat <- data.frame(Symbols, Meaning, Example)
knitr::kable(dfDateFormat,format = "html")
Symbols Meaning Example
%d day as a number (0-31) 01-31
%a abbreviated weekday Mon
%A unabbreviated weekday Monday
%m month (00-12) 00-12
%b abbreviated month Jan
%B unabbreviated month December
%y 2-digit year 17
%Y 4-digit year 2017

III. Các ví dụ

today <- Sys.Date()
print(today)
## [1] "2017-12-03"
today <- Sys.Date()
format(today,format = "%B %d %Y")
## [1] "December 03 2017"
today <- Sys.Date()
format(today,format = "%Y %B %d")
## [1] "2017 December 03"
today <- Sys.Date()
class(today)
## [1] "Date"
charDate <- as.character(today)
class(charDate)
## [1] "character"
charDate <- as.character(Sys.Date())
format(charDate,format = "%Y %B %m")
## [1] "2017-12-03"
#Kế quá không hề thay đổi do charDate đang là kí tự
charDate <- as.Date(charDate,"%Y-%M-%d")
format(charDate,format = "%Y %B %m")
## [1] "2017 December 12"
#Khi convert sang date và sử dụng hàm format kết quả đã được convert

Để hiểu sâu về định dạng, cách convert character sang date có thể gõ lệnh help(as.Date) hoặc help(strftime). Để hiểu về các kiểu định dạng date/times theo chuẩn ISO dùng lệnh help(ISOdatetime).