R软件做为一款数据处理的软件,自然能够处理日期格式的数据。但是R语言里的函数众多,对于许多初学者不知道如何去系统的学习使用。我将花两个篇幅去介绍处理日期的函数,本文系统介绍R语言里的lubridate函数包。
本文先介绍基本的R语言日期处理的常识知识,然后在具体的介绍lubridate函数包里的函数使用。下图是文章结构的展示。
在数据中日期的出现场景很多,也会出现很多技术问题,如何随心所欲的去创建一个时间序列去匹配已经有的数据?怎么处理已经读入的现有的日期数据?那么lubridate包他来了,他就是一个专注解决日期技术的一个包。由于篇幅和能力有限,这篇文章要介绍的也不能面面俱到。只能为读者开个头,更加深入的问题,希望读者去读该包的帮助文档。当然我们也会把本文要解决的问题列出来,并努力讲清楚。
1、日期数据主要有七部分组成:年、月、日、时、分、秒、时区。所以在大的方面分为两部分。
日期型数据: 不含具体时间的日期数据
日期时间型数据: 包含具体时间的日期数据
2、R语言中的日期的类属性是:Date、整数存储。默认从1970年1月1日开始往后的天数。如果读入的数据时整数的同志也不要担心,自行运算便可得到对应日期,当然R语言内部接受默认的日期向量化运算。
例如:1970-01-02储存的整数为1。
下面是本文lubridate包要解决的问题
1、能够实时获取日期型数据和日期时间型数据。
2、自定义生成公式化的日期数据。(Date型)
3、实现日期型数据和日期时间型数据的转化。
4、列出提取Date类中的年月日时分秒等元素。
先介绍获取日期的函数now
和today
函数,按着惯例先介绍函数的参数,由于两个函数的参数比较相似,我们只贴出now
函数的函数体:
function (tzone = "")
with_tz(Sys.time(), tzone)
接着是运行代码效果以及注释:
> today() # 获取当日的 年月日 需要载入lubridate包才可以使用
[1] "2020-03-29"
> lubridate::today() # 获取当日的年月日 不需要载入包
[1] "2020-03-29"
> # 以下函数区别同上 只备注功能
> now() # 获取当日的 年月日 时分秒 时区
[1] "2020-03-29 10:38:33 CST"
> lubridate::now()
[1] "2020-03-29 10:38:33 CST"
上面的注释已经很明朗,我们只解释下CST的含义。他是操作的时候你的电脑ip所在的时区,一般会和你的常识一致,所以不用太过纠结。
构建时间一般是需要字符数据的,这部分的三个函数识别的格式可以是-
分割,也可以是/
分割的。即:
“2020-3-29”或者“2020/3/29”
我们以年月日的函数为例子贴出函数参数和函数体:
function (..., quiet = FALSE, tz = NULL, locale = Sys.getlocale("LC_TIME"),
truncated = 0)
.parse_xxx(..., orders = "ymd", quiet = quiet, tz = tz,
locale = locale, truncated = truncated)
下面是运行例子以及注释:
> # 本例子以单个字符为例子,可以向量化处理
> (da = ymd("2020-3-28")) # 年月日
[1] "2020-03-28"
> class(da) # 查看数据类型
[1] "Date"
> mdy("3-28-2020")
[1] "2020-03-28"
> dmy("28-3-2020")
[1] "2020-03-28"
> # 当然以下字符格式也可以识别
> ymd("2020/3/28")
[1] "2020-03-28"
这里不再进行解释啥,在自定义的时候也常常用到下面的函数。
下面是该函数的参数和函数体,从中我们可以看出该函数的参数很齐全可以随意的生成year, month, day, hour, min, sec,
。
function (year = 1970L, month = 1L, day = 1L, hour = 0L, min = 0L,
sec = 0, tz = "UTC")
{
lengths <- vapply(list(year, month, day, hour, min, sec),
length, 1, USE.NAMES = FALSE)
if (min(lengths) == 0L) {
.POSIXct(numeric(), tz = tz)
}
else {
N <- max(lengths)
C_update_dt(.rep_maybe(origin, N), year = .rep_maybe(year,
N), month = .rep_maybe(month, N), yday = integer(),
mday = .rep_maybe(day, N), wday = integer(), hour = .rep_maybe(hour,
N), minute = .rep_maybe(min, N), second = .rep_maybe(sec,
N), tz = tz)
}
}
下面是一些例子。
make_datetime() # 默认输出 UTC 为本初子午线上平均太阳时。
make_datetime(year = 2020L, month = 3L, day = 29L, hour = 0L, min = 0L,
sec = 0, tz = "UTC") # 输出当下日期
最后介绍下转化函数,这一步不会改变内参数,但是方便统一格式进行运算。 as_date
, as_datetime
这里仅仅贴出该函数的参数,就不再写示例代码了。
> as_date
standardGeneric for "as_date" defined from package "lubridate"
function (x, ...)
standardGeneric("as_date")
standardGeneric("as_date")
Methods may be defined for arguments: x
Use showMethods("as_date") for currently available ones.
> as_datetime
nonstandardGenericFunction for "as_datetime" defined from package "lubridate"
function (x, ...)
{
standardGeneric("as_datetime")
}
code: 0x00000000233d1488>
Methods may be defined for arguments: x
Use showMethods("as_datetime") for currently available ones.
在lubridate包还有其他函数,现在把常用的提取日期各个元素函数汇总如下表:
函数 | 含义 |
---|---|
year | 取出年 |
month | 取出月 |
mday | 取出日 |
yday | 取出一年中的第几天(元旦为1) |
wday | 取出周几(周天为1,周六为7) |
hour | 取出时 |
minute | 取出分 |
second | 取出秒 |