11.2 日期和时间类
R中自带有三个日期和时间类:POSIXct
、POSIXlt
和Date
。
11.2.1 POSIX日期和时间
POSIX日期和时间是R的经典程序。它的实现精彩绝伦,考虑了各种晦涩难懂的技术问题。但它Unix系统的命名非常可怕,让一切看似比本身复杂得多。
R中的两个标准的日期-时间类是POSIXct
和POSIXlt
。(我说过它们的名字很吓人!) POSIX是一套标准,它定义了那些需要遵守的Unix的规定,例如日期和时间该如何设定。ct
是“日历时间”(calendar time)的简称,POSIXct
类记录了以世界标准时(UTC)时区为准的从1970年开始计时的秒数计数2。POSIXlt
将日期存储为一个列表,其中包括秒、分钟、小时和月份等。POSIXct
最适用于存储和计算时间,而POSIXlt
最适用于提取日期中的某个特定部分。
2不要把UTC的缩写与其他通用时间标准相混合(如UT0、UT1等)。本质上,它和(民用的)格林尼治标准时间(GMT)一样,不同之处在于格林威治标准时间并非科学上的标准,而且英国政府也不能改变UTC。*
函数Sys.time
将以POSIXct
的形式返回当前的日期和时间:
(now_ct <- Sys.time())
## [1] "2013-07-17 22:47:01 BST"
now_ct
类有两个元素:一个是POSIXct
变量,还有POSIXct
继承自类POSIXt
:
class(now_ct)
## [1] "POSIXct" "POSIXt"
当日期被打印出来时,你只看到它格式化后的版本,因而不确定日期是如何被存储的。通过使用unclass
,我们发现它只是一个数字:
unclass(now_ct)
## [1] 1.374e+09
打印时,POSIXlt
日期看上去几乎都一样。然而,它们的底层存储机制是非常不同的:
(now_lt <- as.POSIXlt(now_ct))
## [1] "2013-07-17 22:47:01 BST"
class(now_lt)
## [1] "POSIXlt" "POSIXt"
unclass(now_lt)
## $sec
## [1] 1.19
##
## $min
## [1] 47
##
## $hour
## [1] 22
##
## $mday
## [1] 17
##
## $mon
## [1] 6
##
## $year
## [1] 113
##
## $wday
## [1] 3
##
## $yday
## [1] 197
##
## $isdst
## [1] 1
##
## attr(,"tzone")
## [1] "" "GMT" "BST"
使用列表索引来单独访问POSIXlt
日期的每个部分:
now_lt$sec
## [1] 1.19
now_lt[["min"]]
## [1] 47
11.2.2 Date
类
在R的基本包中,第三种日期类命名得稍微好一点:它就是Date
类。它存储了从1970年开始计算的天数3。Date
类最适用于当你不在乎一天中的某个时刻时。小数天也是可能的(例如可通过计算Date
的平均值),但POSIX
类更适合于这种情况:
3历史数据研究人员可能要注意,这里的日期总是以公历计算,所以对于1752年之前的任何事情,都需要仔细检查。
(now_date <- as.Date(now_ct))
## [1] "2013-07-17"
class(now_date)
## [1] "Date"
unclass(now_date)
## [1] 15903
11.2.3 其他日期类
R中还有其他许多处理处理日期和时间的类。如果需要选择日期-时间类,通常你应该坚持使用三个基本类(POSIXct
、POSIXlt
和Date
)中的一个。但如果你正在使用其他人的代码,而这些代码使用了其他的日期-时间类,你就需要对其他类有所了解。
其他来自于各种插件包的日期时间类包括date
、dates
、chron
、yearmon
、yearqtr
、timeDate
、ti
和jul
。