Tác giả: Nguyễn Hải Trường | 2018-08-27
Trong quá trình phân tích dữ liệu, chúng ta sẽ thường gặp phải những vấn đề liên quan đến việc xử lý các biến date
hoặc date-time
. Trong bài viết này, Ranalytics
sẽ hướng dẫn các bạn sử dụng một số hàm cơ bản trong package lubridate
để xử lý các biến date và date-time.
Lubridate package
Trong R
dữ liệu liên quan đến thời gian có 2 kiểu định dạng:
date
: 2018-08-01date-time
: 2018-08-01 16:35:52 (ngày giờ cụ thể)
Package lubridate
là 1 package rất hữu dụng để xử lý date và date-time.
library(lubridate)
library(dplyr)
Lấy thông tin từ Date
Để lấy thông tin ngày, tháng, năm của date chúng ta có thể sử dụng hàm day()
, month()
, year()
tương ứng.
# Giả sử chúng ta lấy ngày hôm nay làm ví dụ: dùng hàm today()
today <- today()
today
## [1] "2019-03-24"
today %>% class
## [1] "Date"
# Ngày
day(today)
## [1] 24
# Tháng
month(today)
## [1] 3
# Năm
year(today)
## [1] 2019
Trong trường hợp chúng ta muốn xem hôm nay là thứ mấy, sử dụng hàm wday()
và thêm option label = T
.
# Thứ trong tuần
wday(today, label = T)
## [1] Sun
## Levels: Sun < Mon < Tue < Wed < Thu < Fri < Sat
Nếu chúng ta muốn xem ngày trong tháng hoặc ngày trong năm, sử dụng hàm mday()
và yday()
tương ứng.
# Ngày trong tháng
mday(today)
## [1] 24
# Ngày thứ bao nhiêu trong năm
yday(today)
## [1] 83
Date-time
Chúng ta có thể dùng các hàm hour()
, minute()
, second()
để biết được giờ, phút, giây của date-time.
# Ngày giờ hiện tại
now <- now()
now
## [1] "2019-03-24 09:54:44 +07"
now %>% class
## [1] "POSIXct" "POSIXt"
# Giờ của ngày hiện tại
hour(now)
## [1] 9
# Phút của ngày hiện tại
minute(now)
## [1] 54
# Giây của ngày hiện tại
second(now)
## [1] 44.62993
Nếu muốn cập nhật lại giờ phút giây của date-time, chúng ta có thể dùng hàm update()
và thêm các option hours
, minutes
, seconds
như mong muốn.
# Giả sử chúng ta cập nhật lại ngày giờ của ngày hiện tại là 15 giờ 30 phút 20 giây
update(now,
hours = 15,
minutes = 30,
seconds = 20)
## [1] "2019-03-24 15:30:20 +07"
Chúng ta có thể dễ dàng chuyển định dạng từ date-time sang date bằng việc sử dụng hàm as.Date()
.
as.Date(now)
## [1] "2019-03-24"
Parsing Date & Date-time
Chúng ta có thể nhập thông tin một ngày nhất định một cách dễ dàng bằng việc sử dụng các hàm như ymd()
, dmy()
, ymd_hms()
…
ymd(20101215)
## [1] "2010-12-15"
mdy("4/1/17")
## [1] "2017-04-01"
ymd_hms("2014-08-23 17:23:02")
## [1] "2014-08-23 17:23:02 UTC"
Time Zones & một số hàm tính toán
Để xem ngày giờ cụ thể tại các quốc gia có múi giờ khác nhau, chúng ta có thể sử dụng hàm with_tz()
. Danh sách các múi giờ cụ thể trong lubridate có thể xem tại đây: http://en.wikipedia.org/wiki/List_of_tz_database_time_zones.
# Múi giờ hiện tại
Sys.timezone()
## [1] "Asia/Bangkok"
# Asia/Bangkok
with_tz(now, tz = "Asia/Bangkok")
## [1] "2019-03-24 09:54:44 +07"
# America/New_York
with_tz(now, tz = "America/New_York")
## [1] "2019-03-23 22:54:44 EDT"
Để có thể thực hiện một số phép tính toán với thời gian như: sau ngày hiện tại x ngày là ngày bao nhiêu, sau ngày hiện tại x tháng là ngày bao nhiêu… chúng ta có thể lấy ngày đó +
một trong các hàm sau tùy theo mục đích: days()
, months()
, years()
, hours()
, minutes()
, seconds()
.
# 2 ngày sau
today + days(2)
## [1] "2019-03-26"
# 2 ngày trước
today + days(-2)
## [1] "2019-03-22"
# 2 tháng sau
today + months(2)
## [1] "2019-05-24"
# 2 năm sau
today + years(2)
## [1] "2021-03-24"
# 2 giờ sau
now + hours(2)
## [1] "2019-03-24 11:54:44 +07"
# 2 phút sau
now + minutes(2)
## [1] "2019-03-24 09:56:44 +07"
# 2 giây sau
now + seconds(2)
## [1] "2019-03-24 09:54:46 +07"
Chúng ta có thể tính toán thời gian giữa 2 ngày bất kỳ bằng việc sử dụng hàm as.period()
.
# Giả sử chúng ta muốn tính toán xem từ ngày 29/12/1992 đến nay là bao lâu?
day_past <- ymd(19921229)
# Tạo khoảng thời gian từ 29/12/1992 đến nay: dùng hàm interval()
how_long <- interval(day_past, today)
# Tính toán thời gian bao lâu
as.period(how_long)
## [1] "26y 2m 24d 0H 0M 0S"
# Có thể thêm option unit để quy đổi ra ngày, tháng hay năm: giả sử quy đổi ra ngày
as.period(how_long, unit = "days")
## [1] "9581d 0H 0M 0S"
Như vậy, chúng ta đã vừa được làm quen với một số hàm cơ bản trong package lubridate để xử lý date và date-time. Chúc các bạn học tập và làm việc hiệu quả với Ranalytics.vn
!