R Cheat Sheet (14): Dates and Times
Contents
1. 日期和时间的表示
R使用Date 类表示日期,使用POSIXct 和POSIXlt 类表示时间。日期实际的存储方式为距离1970年1月1日的天数,POSIXct 中时间的存储方式为距离1970年1月1日的秒数,POSIXlt 中时间的存储方式为秒钟、分种、小时等元素的列表。
1.1. 日期的表示
可以使用Sys.Date() 获取当前日期,它返回的是一个Date 对象:
> d1 <- Sys.Date() > class(d1) [1] "Date"
使用unclass() 函数查看d1 ,其值即为当天距离1970年1月1日的天数:
> unclass(d1) [1] 16576
直接在控制台打印d1 ,可以得到一个“年-月-日”的格式:
> d1 [1] "2015-05-21"
虽然Date 被存储为距离1970年1月1日的天数,它也可以用于表示早于1970年1月1日的日期:
> d2 <- as.Date("1969-01-01") > unclass(d2) [1] -365 > d2 [1] "1969-01-01"
1.2. 时间的表示
使用Sys.time() 可以获取当前时间:
> t1 <- Sys.time() > t1 [1] "2015-05-21 21:10:20 CST" > class(t1) [1] "POSIXct" "POSIXt" > unclass(t1) [1] 1432213821
默认情况下,Sys.time() 返回的是POSIXct 对象,可以使用as.POSIXlt() 函数将POSIXct 转换为POSIXlt :
> t2 <- as.POSIXlt(Sys.time()) > class(t2) [1] "POSIXlt" "POSIXt" > t2 [1] "2015-05-21 21:13:25 CST" > str(unclass(t2)) List of 11 $ sec : num 25.2 $ min : int 13 $ hour : int 21 $ mday : int 21 $ mon : int 4 $ year : int 115 $ wday : int 4 $ yday : int 140 $ isdst : int 0 $ zone : chr "CST" $ gmtoff: int 28800 - attr(*, "tzone")= chr [1:3] "" "CST" "CDT"
可见,POSIXlt 类型的t2 由日期和时间组成。上面的例子中使用str(unclass(t2)) 是为了得到更紧凑的输出。可以直接从t2 中单独取出某个元素,如取出t2 中的分钟:
> t2$min [1] 13
2. 常用函数
下面来看几个用于从日期和时间中提取有用信息的函数。
2.1. 使用weekdays(), months(), quarter()提取有用信息
weekdays() 函数返回任意时期或时间对象在一周中对应的日期,类似地,months() 函数会返回月份,quarter() 函数返回季度:
> weekdays(d1) [1] "星期四" > months(t1) [1] "五月" > quarters(t2) [1] "Q2"
2.2. 使用strptime()格式化时间
有时候,数据集中的日期和时间不能被R识别,这时可以使用strptime() 函数,它可以把表示时间的字符矢量转换为POSIXlt :
> t3 <- "10 17, 1986 08:24" > strptime(t3, "%m %d, %Y %H:%M") [1] "1986-10-17 08:24:00 CST" > t4 <- strptime(t3, "%m %d, %Y %H:%M") > class(t4) > t4 [1] "1986-10-17 08:24:00 CST"
需要注意的是,strptime() 函数中所使用某些占位符是跟系统的locale有关的,如文档所述%B 的含义为“Full month name in the current locale. (Also matches abbreviated name on input.)”,上面的例子仅使用了数字来表示日期,规避了此情况。如在中文系统中,可以使用%B 来格式化“十月”这个中文名称,而用来格式化英文“October”时则会失败:
> tc <- "十月 17, 1986 08:24" > strptime(tc, "%B %d, %Y %H:%M") [1] "1986-10-17 08:24:00 CST" > te <- "October 17, 1986 08:24" > strptime(te, "%B %d, %Y %H:%M") [1] NA
3. 日期和时间的比较和运算
日期和时间可以进行加减和比较操作:
> Sys.time() > t1 [1] TRUE > Sys.time() - t1 Time difference of 28.68598 mins
在计算时间差时,可以使用difftime() 函数指定想要的单位:
> difftime(Sys.time(), t1, units = 'days') Time difference of 0.0204477 days