日期是常见的数据类型。在形式上,日期数据类似于字符串,因此在创建日期变量时通常是从字符串变量转换的。基础工具包base
中包含了一些处理日期数据的函数,tidyverse
系列的lubridate
则是专门处理日期数据的工具包。本文主要介绍这两个 工具包的日期转换函数。
base
工具包
base
工具包的日期转换函数是as.Date()
,它的语法结构如下:
as.Date(x, format,
tryFormats = c("%Y-%m-%d", "%Y/%m/%d"),
optional = FALSE, ...)
x:可被转为日期数据的对象;
format:
x
对应的日期格式;tryFormats:
format
参数缺失时备选的日期格式。
在R中,日期数据的默认格式yyyy-mm-dd
。根据函数语法,当不指定日期格式时,函数会尝试yyyy-mm-dd
或yyyy/mm/dd
两种格式是否符合x
的形式,如果不符合则报错或返回NA
;当x
是向量且元素对应了不止一种格式时,则匹配第一次出现的格式,其余返回NA
。
as.Date("2021-9-19")
## [1] "2021-09-19"
as.Date("2021/9/19")
## [1] "2021-09-19"
date_vector_1 <- c("2021-9-19", "2021/9/19")
as.Date(date_vector_1)
## [1] "2021-09-19" NA
date_vector_2 <- c("2021/9/19", "2021-9-19")
as.Date(date_vector_1)
## [1] "2021-09-19" NA
《R语言实战》中列举了如下常见的日期格式[1],完整内容可见base
工具包的strptime
:
format
参数必须与x
参数的形式保持一致,否则会得出错误的结果:
as.Date("19/9/21", "%d/%m/%y")
## [1] "2021-09-19"
as.Date("19/9/21")
## [1] "0019-09-21"
lubridate
工具包
library(lubridate)
lubridate
工具包使用y
表示年份,m
表示月份,d
表示月份的天数,构建了如下几个函数:
ymd
ydm
mdy
myd
dmy
dym
在转换时,根据形式选取对应的函数即可,如dmy()
函数用于转换日-月-年
形式的日期。下列四行代码的返回结果相同:
dmy("19/9/2021")
dmy("19-9-21")
dmy(190921)
dmy(19092021)
## [1] "2021-09-19"
日期数据的简单运算
library(tidyverse)
data.frame(x = "2021-9-19",
y = "2021-1-1",
stringsAsFactors = F) %>%
mutate(x = as.Date(x),
y = as.Date(y)) -> data
当日期是以日期格式存在时,就可以调用一些函数对其进行处理。
日期相减得到间隔天数:
data$x - data$y
## Time difference of 261 days
日期加减数字用于推算日期:
data$x + 200
## [1] "2022-04-07"
提取日期的成分:
library(lubridate)
year(data$x)
## [1] 2021
month(data$x)
## [1] 9
day(data$x)
## [1] 19
日期转换为数字:
as.numeric(data$x)
## [1] 18889
data$x - as.Date("1970-1-1")
## Time difference of 18889 days
参考资料
[1]
常见的日期格式: R语言实战,人民邮电出版社,p.73.