4.6 日期值

日期值通常以字符串的形式输入到R中,然后转化为以数值形式存储的日期变量。函数as.Date()用于执行这种转化。其语法为as.Date(x, "input_format"),其中x是字符型数据,input_format则给出了用于读入日期的适当格式(见表4-4)。 表4-4 日期格式

符  号 含  义 示  例
%d 数字表示的日期(0~31) 01~31
%a 缩写的星期名 Mon
%A 非缩写星期名 Monday
%m 月份(00~12) 00~12
%b 缩写的月份 Jan
%B 非缩写月份 January
%y 两位数的年份 07
%Y 四位数的年份 2007

日期值的默认输入格式为yyyy-mm-dd。语句:

  1. mydates <- as.Date(c("2007-06-22", "2004-02-13"))

将默认格式的字符型数据转换为了对应日期。相反,

  1. strDates <- c("01/05/1965", "08/16/1975")
  2. dates <- as.Date(strDates, "%m/%d/%Y")

则使用mm/dd/yyyy的格式读取数据。

在我们的leadership数据集中,日期是以mm/dd/yy的格式编码为字符型变量的。因此:

  1. myformat <- "%m/%d/%y"
  2. leadership$date <- as.Date(leadership$date, myformat)

使用指定格式读取字符型变量,并将其作为一个日期变量替换到数据框中。这种转换一旦完成,你就可以使用后续各章中讲到的诸多分析方法对这些日期进行分析和绘图。

有两个函数对于处理时间戳数据特别实用。Sys.Date()可以返回当天的日期,而date()则返回当前的日期和时间。我写下这段文字的时间是2010年12月1日下午4:28。所以执行这些函数的结果是:

  1. > Sys.Date()
  2. [1] "2010-12-01"
  3. > date()
  4. [1] "Wed Dec 01 16:28:21 2010"

你可以使用函数format(x, format="output_format")来输出指定格式的日期值,并且可以提取日期值中的某些部分:

  1. > today <- Sys.Date()
  2. > format(today, format="%B %d %Y")
  3. [1] "December 01 2010"
  4. > format(today, format="%A")
  5. [1] "Wednesday"

format()函数可接受一个参数(本例中是一个日期)并按某种格式输出结果(本例中使用了表4-4中符号的组合)。这里最重要的结果是,距离周末只有两天时间了!

R的内部在存储日期时,是使用自1970年1月1日以来的天数表示的,更早的日期则表示为负数。这意味着可以在日期值上执行算术运算。例如:

  1. > startdate <- as.Date("2004-02-13")
  2. > enddate <- as.Date("2011-01-22")
  3. > days <- enddate - startdate
  4. > days
  5. Time difference of 2535 days

显示了2004年2月13日和2011年1月22日之间的天数。

最后,也可以使用函数difftime()来计算时间间隔,并以星期、天、时、分、秒来表示。假设我出生于1956年10月12日,我现在有多大呢?

  1. > today <- Sys.Date()
  2. > dob <- as.Date("1956-10-12")
  3. > difftime(today, dob, units="weeks")
  4. Time difference of 2825 weeks

很明显,我有2825周这么大,谁又知道呢?最后一个小测验:猜猜我生于星期几?

4.6.1 将日期转换为字符型变量

你同样可以将日期变量转换为字符型变量——虽然不太常用。函数as.character()可将日期值转换为字符型:

  1. strDates <- as.character(dates)

进行转换后,即可使用一系列字符处理函数处理数据(如取子集、替换、连接等)。我们将在第5章中详述字符处理函数。

4.6.2 更进一步

要了解字符型数据转换为日期的更多细节,请查看help(as.Date)help(strftime)。要了解更多关于日期和时间格式的知识,请参考help(ISOdatetime)lubridate包中包含了许多简化日期处理的函数,可以用于识别和解析日期-时间数据,抽取日期—时间成分(例如年份、月份、日期等),以及对日期—时间值进行算术运算。如果你需要对日期进行复杂的计算,那么fCalendar包可能会有帮助。它提供了大量的日期处理函数,可以同时处理多个时区,并且提供了复杂的历法操作功能,支持工作日、周末以及假期。