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.
Để 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
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 |
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).