Lập trình với R: Ngày và Thời gian

Date and time

Date and time


R có một phương thức đặc biệt để biểu diễn ngày và thời gian. Đây là kiểu dữ liệu hữu dụng khi bạn làm việc với dữ liệu mà đòi hỏi giá trị thay đổi theo thời gian (time-series data) hay những dữ liệu chứa các thông tin như ngày sinh chẳng hạn.

Ngày được biểu diễn bởi lớp ‘Date’ và Thời gian được biểu diễn bởi lớp ‘POSIXct’ và ‘POSIXlt’. Bên trong nó, Ngày được lưu dưới dạng số ngày kể từ 1970-01-01 và Thời gian được lưu dưới dạng số giây kể từ 1970-01-01 (POSIXct) hoặc danh sách giây, phút, giờ (POSIXlt).

Ngày

Chúng ta bắt đầu bằng việc lấy ngày hiện tại và lưu vào biến d1.

d1 <- Sys.Date()

# kiểm tra kiểu dữ liệu của d1
class(d1)
[1] "Date"

# quan sát giá trị bên strong biến d1
unclass(d1)
[1] 16632

Giá trị trên bằng đúng số ngày kể từ 1970-01-01. Tuy nhiên, nếu bạn in ra ngoài console thì bạn sẽ nhận được định dạng — YEAR-MONTH-DAY

d1
[1] "2015-07-16"

Giả sử chúng ta muốn xem số ngày trước 1970-01-01 là năm 1969? Ta sẽ tạo biến d2 như sau:

d2 <- as.Date("1969-01-01")

# quan sát giá trị bên strong biến d2
unclass(d2)
[1] -365

Như các bạn dự đoán, chúng ta sẽ nhận được giá trị âm. Trong trường hợp này, -365 chính bằng một năm trước so với 1970-01-01.

Thời gian

Bây giờ, chúng ta sẽ xem cách mà R lưu Thời gian. Chúng ta có thể lấy Ngày và Thời gian hiện tại bằng cách sử dụng hàm Sys.time().

t1 <- Sys.time()

# quan sát nội dung của t1
t1
[1] "2015-07-16 16:39:52 JST"

# kiểm tra kiểu dữ liệu của t1
class(t1)
[1] "POSIXct" "POSIXt"

Như đã đề cập trước đó, POSIXct là một trong hai cách mà R biểu diễn thông tin về thời gian (tạm thời có thể không quan tâm đến giá trị thứ hai, POSIXt, chỉ là hàm như POSIXct và POSIXlt). Ta dùng hàm unclass() để xem giá trị bên trong biến t1 (số giây kể từ năm 1970).

unclass(t1)
[1] 1437032393

Mặc định, Sys.time() sẽ trả về đối tượng thuộc lớp POSIXct, nhưng chúng ta có thể ép kiểu kết quả thành POSIXlt với hàm as.POSIXlt(Sys.time()).

t2 <- as.POSIXlt(Sys.time())

# kiểm tra kiểu dữ liệu của t2
class(t2)
[1] "POSIXlt" "POSIXt"

# quan sát nội dung của t2
t2
[1] "2015-07-16 16:40:19 JST"

# can sát giá trị bên trong t2
unclass(t2)
$sec
[1] 19.53488

$min
[1] 40

$hour
[1] 16

$mday
[1] 16

$mon
[1] 6

$year
[1] 115

$wday
[1] 4

$yday
[1] 196

$isdst
[1] 0

$zone
[1] "JST"

$gmtoff
[1] 32400

attr(,"tzone")
[1] ""    "JST" "JDT"

t2 đối tượng thuộc lớp POSIXlt (danh sách các giá trị tạo nên Ngày và Thời gian). Sử dụng hàm str(unclass(t2)) để có kết quả hiển thị gọn hơn.

str(unclass(t2))
List of 11
 $ sec   : num 19.5
 $ min   : int 40
 $ hour  : int 16
 $ mday  : int 16
 $ mon   : int 6
 $ year  : int 115
 $ wday  : int 4
 $ yday  : int 196
 $ isdst : int 0
 $ zone  : chr "JST"
 $ gmtoff: int 32400
 - attr(*, "tzone")= chr [1:3] "" "JST" "JDT"

# chỉ lấy thông tin phút của t2
t2$min
[1] 40

Hiện tại chúng ta đã khảo sát hết ba loại kiểu dữ liệu của đối tượng Ngày và Thời gian. Chúng ta hãy xem thêm các hàm rút trích thông tin hữu ích từ ba kiểu dữ liệu này — weekdays(), months(), và quarters().

# lấy thông tin thứ trong tuần
weekdays(d1)
[1] "Thursday"

# lấy thông tin tháng của t1 (POSIXct)
months(t1)
[1] "July"

# lấy thông tin quý trong năm của t2 (POSIXlt)
quarters(t2)
[1] "Q3"

Thông thường, tập dữ liệu về Ngày và Thời gian có định dạng mà R không thể nhận diện được. Hàm strptime() sẽ giúp ta giải quyết tình huống này. Hàm này sẽ chuyển đổi character vectors thành POSIXlt. Tương tự như hàm as.POSIXlt(), ngoại trừ thông tin đầu vào không cần ở dạng (YYYY-MM-DD).

t3 <- "October 17, 1986 08:24"

# chuyển đổi sang định dạng Ngày và Thời gian mà R có thể nhận diện
t4 <- strptime(t3, "%B %d, %Y %H:%M")
t4
[1] "1986-10-17 08:24:00 JST"

# kiểm tra kiểu dữ liệu của t4
class(t4)
[1] "POSIXlt" "POSIXt"

Cuối cùng, có rất nhiều toán tử có thể thao tác trên dữ liệu Ngày và Thời gian, bao gồm toán tử số học (+ và -) và so sánh (<, ==, …)
# so sánh thời gian hiện tại với thời gian t1 trước đó
Sys.time() > t1
[1] TRUE

# khoảng cách giữa hai thời điểm
Sys.time() – t1
Time difference of 2.205859 mins

# tương tự như tính toán trên với hàm difftime()
difftime(Sys.time(), t1, units = 'days')
Time difference of 0.001664682 days

Trong bài viết này, chúng ta đã học về cơ chế lưu Ngày và Thời gian bên trong R. Nếu bạn làm việc nhiều với kiểu dữ liệu này thì bạn nên xem qua lubridate package phát triển bởi Hadley Wickham.

Nguồn tham khảo: http://swirlstats.com/

Advertisements

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s