lubridate包,非常强大,能够识别各种类型的日期.字符型和时间型数据,都是格式比较特别的你数据,在处理时,比较麻烦,但是有了lubridate这个包之后,时间处理变得非常简单,这个包函数命名简单,格式比较统一.

解析日期和时间

首先,lubridate函数的方便之处在于无论年月日之间以什么间隔符分隔,它总能找到正确的值且返回的是数字值,比如:

> year("2016-10-24")  
[1] 2016
> year("2016/10/24")
[1] 2016
> month("2016/10/24")
[1] 10
> day("2016/10/24")
[1] 24

同时,lubridate还提供了函数帮助处理不同排列顺序的年月日数据:

> ymd("20110604")
[1] "2011-06-04"
> mdy("06-04-2011")
[1] "2011-06-04"
> dmy("04/06/2011")
[1] "2011-06-04"
> dmy("04062011") 
[1] "2011-06-04"

如果您的日期包含时间信息,添加H,M,和/或s函数的名称。ymd_hms可能是最常见的日期和时间格式。要阅读的具体日期,具有一定的时区,提供在该时区的正式名称tz参数。

ymd_hms("20161120220000")
[1] "2016-11-20 22:00:00 UTC"

> ymd_hms("2016-11-20 22:00:00", tz = "Pacific/Auckland")
[1] "2016-11-20 22:00:00 NZDT"

ymd,mdy,dmy分别表示了三种常见的年月日排列方式,通过这种方式我们就可以把不同的日期数据都转化为标准的日期数据。

时区

为了处理时区信息,lubridate包提供了三个函数:
tz:提取时间数据的时区
with_tz:将时间数据转换为另一个时区的同一时间
force_tz:将时间数据的时区强制转换为另一个时区

有两个非常有用的事情要做日期和时区。首先,显示不同的时区相同的时刻。二,创建由现有的时钟时间与新的时区相结合的新时刻。

这些被完成with_tzforce_tz

输入meeting在Pacific/Auckland的开场时间,再转为America/Chicago时间

> meeting <- ymd_hms("2011-07-01 09:00:00", tz = "Pacific/Auckland");meeting
[1] "2011-07-01 09:00:00 NZST"
> with_tz(meeting, "America/Chicago")    #显示不同的时区相同的时刻
[1] "2011-06-30 16:00:00 CDT"
> mistake <- force_tz(meeting, "America/Chicago");mistake
[1] "2011-07-01 09:00:00 CDT"
> with_tz(mistake, "Pacific/Auckland")
[1] "2011-07-02 02:00:00 NZST"

设置和提取信息

提取与功能的日期时间的信息secondminutehourdaywdayydayweekmonthyear,和tz。您也可以使用这些设置(即改变)给定的信息。请注意,这将改变日期和时间,wdaymonth具有可选的label参数,它取代了他们的数字输出和平日或月的名称。

> year("2011-08-10 14:20:01")
[1] 2011
> minute("2011-08-10 14:20:01")
[1] 20
> week("2011-08-10 14:20:01")
[1] 32

时间间隔

lubridate还允许我们定义一个时间区间,例如:

> interval(ymd(20161101), ymd(20161103))
[1] 2016-11-01 UTC--2016-11-03 UTC

两个时间段是由--相连的,UTC表示时区

date1 <- as.POSIXct("2016-11-08 01:59:59")  #POSIXct: 日期时间类,精确到秒,用数字表示

date2 <- as.POSIXct("2016-12-29 12:00:00")
interval(date1, date2)

[1] 2016-11-08 01:59:59 CST--2016-12-29 12:00:00 CST

date1 <- as.POSIXlt("2016-11-08 01:59:59") #POSIXlt: 日期时间类,精确到秒,用列表表示
date2 <- as.POSIXlt("2016-12-29 12:00:00")
interval(date1, date2)

[1] 2016-11-08 01:59:59 UTC--2016-12-29 12:00:00 UTC

处理日期数据的时候,使用了as.POSIXct函数,但是现在发现一个问题,这个函数貌似不能处理类似于
"%Y-%m-%d %H:%M:%S"的日期格式。

lubridate允许我们在给时间数据赋值的时候加上时区这一项,由于在日常生活中使用可能性较小,这篇文章里就不涉及了。

> int1<-interval(ymd(20161101), ymd(20161103)); int1
有了时间区间的定义,我们还可以判断一个时间区间是否在另一个时间区间里面,用"%within%"操作符。
> as.period(int1)
[1] "2d 0H 0M 0S"
> int1 / dminutes(1)
[1] 2880

如上还可以查看或计算一个时间区间的长度。

把时间间隔保存为一个lubridate间隔类对象。这是非常有用的哦!

间隔是特定的时间跨度(因为它们依赖于具体日期),但也lubridate提供两种一般时间跨度类:持续时间和周期。创建期间辅助功能的时间(复数)的单位命名。创建工期的辅助函数遵循相同的格式,但用“D”(持续时间)开始,或者,如果你喜欢,和“e”(有关详细)。

时间数据运算

此外我们还可以用对时间数据进行加减,这也是很有用的,因为有时候我们要判断两个时间之间的间隔是否超过了某个值:

> minutes(2) ## period
[1] "2M 0S"
> dminutes(2) ## duration
[1] "120s (~2 minutes)"

minutes(2)函数表示的2个整分钟的概念,而dminutes(2)则是具体120秒

dyears(1)表示的365天years(1)则是一个整年的概念

leap_year()函数可以判断是否是闰年

> leap_year(2016) #判断是否是闰年
[1] TRUE
> ymd('20160228')+dyears(1)
[1] "2017-02-27"
> ymd('20160228')+years(1)
[1] "2017-02-28"

矢量

在lubridate代码矢量,并准备在交互式设置和功能内所使用。举个例子,我提供了一个功能,推进的日期当月的最后一天last_day <- function(date) {

  ceiling_date(date, "month") - days(1)
}

####################################

lubridate包主要有两类函数,一类是处理时点数据(time instants),另一类是处理时段数据(time spans)。有了时点和时段数据,就可以进行各种计算了。
时点类函数,它包括了解析、抽取、修改

从字符型数据解析时间,会自动识别各种分隔符
> x <- ymd('2016-11-20');x
[1] "2016-11-20"
观察x日期是一年中的第几天
> yday(x)
[1] 325
 修改x日期中的月份为5月
> month(x) <- 5 ;month(x)
[1] 5

> x
[1] "2016-05-20"

注意点:

时段类函数,它可以处理三类对象,分别是:
interval:最简单的时段对象,它由两个时点数据构成。
duration:去除了时间两端的信息,纯粹以秒为单位计算时段的长度,不考虑闰年和闰秒,它同时也兼容基本包中的difftime类型对象。
period:以较长的时钟周期来计算时段长度,它考虑了闰年和闰秒,适用于长期的时间计算

从两个时点生成一个interval时段数据

> x <- ymd('2016-11-20');x

> y <- interval(x,now());y
从interval格式转为duration格式
> as.duration(y)
时点+时段生成一个新的时点
> now() + as.duration(y)
10天后的时间数据
> now() + ddays(10)

几个月和几年的长度常常这样做算术他们可以直观的改变。考虑一个简单的操作,January 31st + one month。如果答案是:
1,February 31st (不存在)
2,March 4th (1月31日以后31天),或
3,February 28th (假设它不是一个闰年)
但它是一个无效的日期。则使lubridate尽可能一致,如果加上或减去一个月或一年创建一个无效的日期,lubridate将返回NA
2或3的解决方案,或使用特殊的%m+%和%m-%。%m+%并%m-%自动回滚可以追溯到一个月的最后一天,应该说是必要的。

jan31 <- ymd("2013-01-31")
jan31 + months(0:11)
##  [1] "2013-01-31" NA           "2013-03-31" NA           "2013-05-31"
## [6] NA "2013-07-31" "2013-08-31" NA "2013-10-31"
## [11] NA "2013-12-31"
floor_date(jan31, "month") + months(0:11) + days(31)
##  [1] "2013-02-01" "2013-03-04" "2013-04-01" "2013-05-02" "2013-06-01"
## [6] "2013-07-02" "2013-08-01" "2013-09-01" "2013-10-02" "2013-11-01"
## [11] "2013-12-02" "2014-01-01"
jan31 %m+% months(0:11)
##  [1] "2013-01-31" "2013-02-28" "2013-03-31" "2013-04-30" "2013-05-31"
## [6] "2013-06-30" "2013-07-31" "2013-08-31" "2013-09-30" "2013-10-31"
## [11] "2013-11-30" "2013-12-31"

请注意,这只会影响使用算术个(和算术多年,如果你的起始日期是2月29日)。

R----lubridata包介绍学习的更多相关文章

  1. R----dplyr包介绍学习

    dplyr包:plyr包的替代者,专门面对数据框,将ddplyr转变为更易用的接口 %>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以 ...

  2. R----stringr包介绍学习

    1. stringr介绍 stringr包被定义为一致的.简单易用的字符串工具集.所有的函数和参数定义都具有一致性,比如,用相同的方法进行NA处理和0长度的向量处理. 字符串处理虽然不是R语言中最主要 ...

  3. R----ggplot2包介绍学习

    分析数据要做的第一件事情,就是观察它.对于每个变量,哪些值是最常见的?值域是大是小?是否有异常观测? ggplot2图形之基本语法: ggplot2的核心理念是将绘图与数据分离,数据相关的绘图与数据无 ...

  4. R----ggplot2包介绍学习--转载

    https://www.cnblogs.com/nxld/p/6059603.html 分析数据要做的第一件事情,就是观察它.对于每个变量,哪些值是最常见的?值域是大是小?是否有异常观测? ggplo ...

  5. R-RMySQL包介绍学习

    参考内容: RMySQL数据库编程指南R语言使用RMySQL连接及读写Mysql数据库 RMySql包安装和加载优点问题,试着根据提示简单安装和加载可以使用,后续再查询资料解决. 3.2.1 连接数据 ...

  6. R----tidyr包介绍学习

    tidyr包:reshape2的替代者,功能更纯粹 tidyr包的应用 tidyr主要提供了一个类似Excel中数据透视表(pivot table)的功能;gather和spread函数将数据在长格式 ...

  7. R----data.table包介绍学习

    相比dplyr包,data.table包能够更大程度地提高数据的处理速度,这里就简单介绍一下data.tale包的使用方法. data.table:用于快速处理大数据集的哦 数据的读取 data.ta ...

  8. R----Shiny包介绍学习

    为什么用Shiny Shiny让数据分析师写完分析与可视化代码后,稍微再花几十分钟,就可以把分析代码工程化,将分析成果快速转化为交互式网页分享给别人.所以,如果你是一名使用R的数据分析师,选择Shin ...

  9. R----plotly包介绍学习

    plotly包:让ggplot2的静态图片变得可交互 Plotly 是个交互式可视化的第三方库,官网提供了Python,R,Matlab,JavaScript,Excel的接口,因此我们可以很方便地在 ...

随机推荐

  1. HTML DOM insertBefore() 方法 使用的时候发现一个问题,记录下

    在W3C中是这样定义的   第二个参数是可先的,但是在谷歌浏览器和火狐浏览器中测试是会有bug的,第二个参数是必填的,否则会报错 感兴趣的可以测试 以下是我测试的结果: 谷歌浏览器:Uncaught ...

  2. mongod 命令执行发现已经有进程在运行mongod数据库--errno:48 Address already in use for socket: 0.0.0.0:27017

    错误信息: listen(): bind() failed errno:48 Address already in use for socket: 0.0.0.0:27017 27017端口已经被占用 ...

  3. [IT新应用]如何用好搜索引擎学习英语

    用谷歌可以学习英语,用必应也可以的. 输入如下地址:global.bing.com,如果是中文界面,就单击顶部右侧“Switch to Bing in English”. 这个界面有很多英文原版的时事 ...

  4. Android 6.0 权限管理

    google官方例子: https://github.com/googlesamples/android-RuntimePermissions Android 6.0在我们原有的AndroidMani ...

  5. java notify和notifyAll的区别

    首先从名字可以了解,notify是通知一个线程获取锁,notifyAll是通知所有相关的线程去竞争锁. notify不能保证获得锁的线程,真正需要锁,并且可能产生死锁. 举例1: 所有人(消费者线程) ...

  6. 获取 Cookie

    /// <summary>    /// 获取WPF url 地址中的Cookies    /// </summary>    public partial class Coo ...

  7. [troubleshoot][archlinux][X] GPU HANG

    前言:如下内容已经是在hang完大概半个多月后了,当时想写,一直没过来写,写blog果然也是已经花费时间的事情. 最近一直在休假,电脑的使用频率也不多.后来还是为了生活,不情愿的去开始上班了,上班的第 ...

  8. rabbitmq之amqp queue

    rabbitmq作为一个消息中间件,暂存信息的能力是必不可少的. 镜像队列

  9. SevenZip.pas BUG修改版 - 20160613

    原始版本: Henri Gourvest <hgourvest@gmail.com> 1.2版本 BUG修改: 1.对于文件名中带有空格的文件, 无法压缩, 原因是1488行, 压缩调用的 ...

  10. csrf 跨站请求伪造

    转自  http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html