R Cheat Sheet (14): Dates and Times

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