11.2 日期和时间类

R中自带有三个日期和时间类:POSIXctPOSIXltDate

11.2.1 POSIX日期和时间

POSIX日期和时间是R的经典程序。它的实现精彩绝伦,考虑了各种晦涩难懂的技术问题。但它Unix系统的命名非常可怕,让一切看似比本身复杂得多。

R中的两个标准的日期-时间类是POSIXctPOSIXlt。(我说过它们的名字很吓人!) POSIX是一套标准,它定义了那些需要遵守的Unix的规定,例如日期和时间该如何设定。ct是“日历时间”(calendar time)的简称,POSIXct类记录了以世界标准时(UTC)时区为准的从1970年开始计时的秒数计数2。POSIXlt将日期存储为一个列表,其中包括秒、分钟、小时和月份等。POSIXct最适用于存储和计算时间,而POSIXlt最适用于提取日期中的某个特定部分。

2不要把UTC的缩写与其他通用时间标准相混合(如UT0、UT1等)。本质上,它和(民用的)格林尼治标准时间(GMT)一样,不同之处在于格林威治标准时间并非科学上的标准,而且英国政府也不能改变UTC。*

函数Sys.time将以POSIXct的形式返回当前的日期和时间:

  1. (now_ct <- Sys.time())
  2. ## [1] "2013-07-17 22:47:01 BST"

now_ct类有两个元素:一个是POSIXct变量,还有POSIXct继承自类POSIXt

  1. class(now_ct)
  2. ## [1] "POSIXct" "POSIXt"

当日期被打印出来时,你只看到它格式化后的版本,因而不确定日期是如何被存储的。通过使用unclass,我们发现它只是一个数字:

  1. unclass(now_ct)
  2. ## [1] 1.374e+09

打印时,POSIXlt日期看上去几乎都一样。然而,它们的底层存储机制是非常不同的:

  1. (now_lt <- as.POSIXlt(now_ct))
  2. ## [1] "2013-07-17 22:47:01 BST"
  3. class(now_lt)
  4. ## [1] "POSIXlt" "POSIXt"
  5. unclass(now_lt)
  6. ## $sec
  7. ## [1] 1.19
  8. ##
  9. ## $min
  10. ## [1] 47
  11. ##
  12. ## $hour
  13. ## [1] 22
  14. ##
  15. ## $mday
  16. ## [1] 17
  17. ##
  18. ## $mon
  19. ## [1] 6
  20. ##
  21. ## $year
  22. ## [1] 113
  23. ##
  24. ## $wday
  25. ## [1] 3
  26. ##
  27. ## $yday
  28. ## [1] 197
  29. ##
  30. ## $isdst
  31. ## [1] 1
  32. ##
  33. ## attr(,"tzone")
  34. ## [1] "" "GMT" "BST"

使用列表索引来单独访问POSIXlt日期的每个部分:

  1. now_lt$sec
  2. ## [1] 1.19
  3. now_lt[["min"]]
  4. ## [1] 47

11.2.2 Date

在R的基本包中,第三种日期类命名得稍微好一点:它就是Date类。它存储了从1970年开始计算的天数3。Date类最适用于当你不在乎一天中的某个时刻时。小数天也是可能的(例如可通过计算Date的平均值),但POSIX类更适合于这种情况:

3历史数据研究人员可能要注意,这里的日期总是以公历计算,所以对于1752年之前的任何事情,都需要仔细检查。

  1. (now_date <- as.Date(now_ct))
  2. ## [1] "2013-07-17"
  3. class(now_date)
  4. ## [1] "Date"
  5. unclass(now_date)
  6. ## [1] 15903

11.2.3 其他日期类

R中还有其他许多处理处理日期和时间的类。如果需要选择日期-时间类,通常你应该坚持使用三个基本类(POSIXctPOSIXltDate)中的一个。但如果你正在使用其他人的代码,而这些代码使用了其他的日期-时间类,你就需要对其他类有所了解。

其他来自于各种插件包的日期时间类包括datedateschronyearmonyearqtrtimeDatetijul