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 对象:

使用 unclass() 函数查看 d1 ,其值即为当天距离1970年1月1日的天数:

直接在控制台打印 d1 ,可以得到一个“年-月-日”的格式:

虽然 Date 被存储为距离1970年1月1日的天数,它也可以用于表示早于1970年1月1日的日期:

1.2. 时间的表示

使用 Sys.time() 可以获取当前时间:

默认情况下, Sys.time() 返回的是 POSIXct 对象,可以使用 as.POSIXlt() 函数将 POSIXct 转换为 POSIXlt :

可见, POSIXlt 类型的 t2 由日期和时间组成。上面的例子中使用 str(unclass(t2)) 是为了得到更紧凑的输出。可以直接从 t2 中单独取出某个元素,如取出 t2 中的分钟:

2. 常用函数

下面来看几个用于从日期和时间中提取有用信息的函数。

2.1. 使用weekdays(), months(), quarter()提取有用信息

weekdays() 函数返回任意时期或时间对象在一周中对应的日期,类似地, months() 函数会返回月份, quarter() 函数返回季度:

2.2. 使用strptime()格式化时间

有时候,数据集中的日期和时间不能被R识别,这时可以使用 strptime() 函数,它可以把表示时间的字符矢量转换为 POSIXlt :

需要注意的是, strptime() 函数中所使用某些占位符是跟系统的locale有关的,如文档所述 %B 的含义为“Full month name in the current locale. (Also matches abbreviated name on input.)”,上面的例子仅使用了数字来表示日期,规避了此情况。如在中文系统中,可以使用 %B 来格式化“十月”这个中文名称,而用来格式化英文“October”时则会失败:

3. 日期和时间的比较和运算

日期和时间可以进行加减和比较操作:

在计算时间差时,可以使用 difftime() 函数指定想要的单位: