Xử lý dữ liệu thời gian với lubridate

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-01

  • date-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] "2018-08-27"
today %>% class
## [1] "Date"
# Ngày 
day(today)
## [1] 27
# Tháng 
month(today)
## [1] 8
# Năm 
year(today)
## [1] 2018

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] Mon
## 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()yday() tương ứng.

# Ngày trong tháng
mday(today)
## [1] 27
# Ngày thứ bao nhiêu trong năm
yday(today)
## [1] 239

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] "2018-08-27 07:27:48 +07"
now %>% class
## [1] "POSIXct" "POSIXt"
# Giờ của ngày hiện tại
hour(now)
## [1] 7
# Phút của ngày hiện tại
minute(now)
## [1] 27
# Giây của ngày hiện tại
second(now)
## [1] 48.13216

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] "2018-08-27 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] "2018-08-27"

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] "2018-08-27 07:27:48 +07"
# America/New_York
with_tz(now, tz = "America/New_York")
## [1] "2018-08-26 20:27:48 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] "2018-08-29"
# 2 ngày trước
today + days(-2)
## [1] "2018-08-25"
# 2 tháng sau
today + months(2)
## [1] "2018-10-27"
# 2 năm sau
today + years(2)
## [1] "2020-08-27"
# 2 giờ sau
now + hours(2)
## [1] "2018-08-27 09:27:48 +07"
# 2 phút sau
now + minutes(2)
## [1] "2018-08-27 07:29:48 +07"
# 2 giây sau
now + seconds(2)
## [1] "2018-08-27 07:27:50 +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] "25y 7m 29d 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] "9372d 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!

comments powered by Disqus