R语言入门——日期的处理(一)

引言

目的

R软件做为一款数据处理的软件,自然能够处理日期格式的数据。但是R语言里的函数众多,对于许多初学者不知道如何去系统的学习使用。我将花两个篇幅去介绍处理日期的函数,本文系统介绍R语言里的lubridate函数包。

文章结构

本文先介绍基本的R语言日期处理的常识知识,然后在具体的介绍lubridate函数包里的函数使用。下图是文章结构的展示。
在这里插入图片描述

lubridate包的主要函数简介

lubridate包简介

在数据中日期的出现场景很多,也会出现很多技术问题,如何随心所欲的去创建一个时间序列去匹配已经有的数据?怎么处理已经读入的现有的日期数据?那么lubridate包他来了,他就是一个专注解决日期技术的一个包。由于篇幅和能力有限,这篇文章要介绍的也不能面面俱到。只能为读者开个头,更加深入的问题,希望读者去读该包的帮助文档。当然我们也会把本文要解决的问题列出来,并努力讲清楚。

常识

1、日期数据主要有七部分组成:年、月、日、时、分、秒、时区。所以在大的方面分为两部分。
日期型数据: 不含具体时间的日期数据
日期时间型数据: 包含具体时间的日期数据
2、R语言中的日期的类属性是:Date、整数存储。默认从1970年1月1日开始往后的天数。如果读入的数据时整数的同志也不要担心,自行运算便可得到对应日期,当然R语言内部接受默认的日期向量化运算。
例如:1970-01-02储存的整数为1。

尝试解决的问题

下面是本文lubridate包要解决的问题
1、能够实时获取日期型数据和日期时间型数据。
2、自定义生成公式化的日期数据。(Date型)
3、实现日期型数据和日期时间型数据的转化。
4、列出提取Date类中的年月日时分秒等元素。

获取实时日期

先介绍获取日期的函数nowtoday函数,按着惯例先介绍函数的参数,由于两个函数的参数比较相似,我们只贴出now函数的函数体:

function (tzone = "") 
with_tz(Sys.time(), tzone)
<bytecode: 0x0000000023316550>
<environment: namespace:lubridate>

接着是运行代码效果以及注释:

> 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所在的时区,一般会和你的常识一致,所以不用太过纠结。

自定义日期

时间 ymd、mdy、dmy

构建时间一般是需要字符数据的,这部分的三个函数识别的格式可以是-分割,也可以是/分割的。即:

“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)
<bytecode: 0x0000000014df6118>
<environment: namespace:lubridate>

下面是运行例子以及注释:

> # 本例子以单个字符为例子,可以向量化处理
> (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"

这里不再进行解释啥,在自定义的时候也常常用到下面的函数。

make_datetime

下面是该函数的参数和函数体,从中我们可以看出该函数的参数很齐全可以随意的生成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)
    }
}
<bytecode: 0x0000000016744c60>
<environment: namespace:lubridate>

下面是一些例子。

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")
<bytecode: 0x000000002339a140>
<environment: 0x000000002338dae8>
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>
<environment: 0x00000000233c5d88>
Methods may be defined for arguments: x
Use  showMethods("as_datetime")  for currently available ones.

lubridate包中常用函数汇总

在lubridate包还有其他函数,现在把常用的提取日期各个元素函数汇总如下表:

函数 含义
year 取出年
month 取出月
mday 取出日
yday 取出一年中的第几天(元旦为1)
wday 取出周几(周天为1,周六为7)
hour 取出时
minute 取出分
second 取出秒
发布了7 篇原创文章 · 获赞 31 · 访问量 9782

猜你喜欢

转载自blog.csdn.net/weixin_46111814/article/details/105171017