R语言的基础包中提供了三种基本类型用于处理日期和时间,Date用于处理日期,它不包括时间和时区信息;POSIXct/POSIXlt用于处理日期和时间,其中包括了日期、时间和时区信息。R内部在存储日期和时间时,使用不同的方式:

  • Date类:存储了从1970年1月1日以来开始计算的天数,更早的日期表示为负值,也就是说,Date类型是一个整数,以天为单位来计算日期,因此,Date适合用于计算日期。
  • POSIXct类:记录了以时间标准时间(UTC)时区位准的,从1970年1月1日开始计时的秒数,即,POSIXct类型是整数,以秒为单位来计算时间,因此,POSIXct最适合用于存储和计算时间。
  • POSIXlt类:把日期和时间存储为一个列表,其中包括秒、分、时和月份等,POSIXlt是使用列表来表示日期和时间,因此,POSIXlt最适合用于提取日期中的特定部分。

一般来讲,R语言中创建的时间数据是通过字符型转化而来,字符串和时间类型无法隐式转换,必须通过相应的函数来类解析文本。

一,系统当前的日期和时间

在编程中,为了获得当前的日期和时间,有两个常用的函数,这两个函数以Sys开头,返回的时间受到操作系统区域设置的影响,因此,返回的时间采用本地格式,符合本地的阅读习惯:

> Sys.Date()
[] "2018-05-07"
> Sys.time()
[] "2018-05-07 22:11:45 CST"

R还有一个函数date(),用于返回当前时间对应的文本,只不过格式比较奇葩:

> date()
[] "Tue May 08 11:32:52 2018"

二,把文本解析成日期和时间

日期值通常以文本的形式输入到R中,然后转化为以数值形式存储的日期变量。而日期需要转换为文本,才方便读取。

1, as.Date() 把文本转换为日期

函数 as.Date()用于把文本转换为Date类型:

as.Date(x, format)

format参数用于指定输入的格式,常用的日期格式符号是:

  • %y:两位数字表示的年份(00-99),不带世纪,例如,数值是18,格式%y,表示2018年
  • %Y:四位数字表示的年份(0000-9999)
  • %m:两位数字的月份,取值范围是01-12,或1-12
  • %d:月份中的天,取值范围是01-31
  • %e:月份中的天,取值范围是1-31
  • %b:缩写的月份(Jan、Feb、Mar等)
  • %B:英语月份全名(January、February 、March等)
  • %a:缩写的星期名(Mon、Tue、Wed、Thur、Fri、Sat、Sun)
  • %A:星期全名

例如,把一个向量中的字符元素转换为日期类型:

as.Date(c('2018-05-01','2018-05-05'),'%Y-%m-%d')

2,strptime() 解析日期

函数strptime(),是string parse time的简称,返回POSIXlt日期。在解析日期时,必须指定文本和日期对应的位置,日期的格式使用%+字母来指定。

format(x, format = "", tz = "")

参数tz是时区(time zone),默认值是空,在解析时,如果不指定时区,R会调用Sys.timezone

日期格式和format()函数相同,常用的时间格式符号是:

  • %H:小时(24小时制)
  • %I:小时(12小时制)
  • %p:对于12小时制,指定上午(AM)或下午(PM)
  • %M:分钟
  • %S:秒

例如,把date()函数返回的文本解析成时间类型:

> nowstr <- date()
> nowtime <- strptime(nowstr,'%a %b %d %H:%M:%S %Y')
> print(nowtime)
[] "2018-05-08 13:01:04 CST"

三,把日期和时间格式化为文本

把日期和时间格式化成文本,便于阅读

1,format() 把日期转换为文本

对日期进行格式化,转换为可读的文本,format()函数的定义是:

format(x, format = "", tz = "")

x是日期参数,format是输出的格式,tz是时区,该函数按照指定的格式输出文本:

today <- Sys.Date()
mydate <- format(today,format='%Y-%m-%d')

2,strftime()格式化日期

函数strftime(),是string formated time的简称,用于把时间转换为字符串,

strptime(x, format, tz = "")

该函数和format()函数的功能和使用方式几乎完全相同。

today <- Sys.Date()
mydate <- strftime(today,format='%Y-%m-%d')

四,日期的比较

由于POSIXct类是以秒为单位来计算时间,Date类是以天为单位类计算日期,这意味着可以在日期值上执行比较运算和算术运算:

  • 将数字和Date类相加,增加或减少相应的天数
  • 将数字和POSIXct类相加,增加或减少相应的秒数

1,时间和数字相加

时间以秒为单位:

> time1 <- Sys.time()
> print(time1)
[] "2018-05-08 13:16:36 CST"
> print(time1+*)
[] "2018-05-08 14:16:36 CST"

日期以天为单位:

> date1 <- Sys.Date()
> print(date1)
[] "2018-05-08"
> print(date1+)
[] "2018-05-09"

2,时间比较

由于Date类和POSIXct类实际上都是一个整数,可以直接比较大小

date1 <- as.Date('2018-01-01')
date2 <- as.Date('2018-02-01')
if (date2>date1) print ('gt')

五,lubridate包介绍

lubridate包使得日期和时间的处理更加规范,简单和灵活。lubridate中所有解析函数都会返回POSIXct日期,默认都是用UTC时区。

lubridate包主要有两类函数,一类是处理时点数据(time instants),另一类是处理时段数据(time spans)。

安装和载入lubridate包:

install.packages("lubridate")
library(lubridate)

系统的当前时间now(),和Sys.time()函数返回的时间相同;系统的当前日期today(),和Sys.Date()函数返回的日期相同:

now(tzone = "")
today(tzone = "")

1,从字符串转换为日期类型

ymd() 函数用于从字符型数据解析时间,该函数会自动识别各种分隔符,函数的定义是:

ymd(..., quiet = FALSE, tz = NULL)

参数注释:

  • quiet:布尔值,当指定为TRUE时,移除文本中自定义的文本
  • tz:时区,默认值是NULL

基本用法如下:

x <- ymd('2010-04-08')

而ymd代表文本的格式必须依次是:year、month、day,除了ymd之外,还有ydm、mdy、myd、dmy、dym。

2,从字符类型转换为时间类型

ymd_hms()函数用于把文本解析为时间,该函数会自动识别各种分隔符

ymd_hms(..., quiet = FALSE, tz = "UTC")

3,抽取或设置时间的部分

  • date:抽取或设置时间的日期
  • year
  • month
  • day
  • week
  • hour
  • minute
  • second

例如,抽取当前时间的月份:

> month(t<-now())
[]

例如,设置当前时间的月份为6月:

x< now()
month(x) <-

4,时间间隔(Intervals)

时间间隔是由开始时间和结束时间构成的对象,本身用途不大,最常用于指定期间和周期:

auckland <- interval(arrive, leave)
auckland
#> [] -- :: NZST---- :: NZST
auckland <- arrive %--% leave
auckland
#> [] -- :: NZST---- :: NZST

5,时间的运算

lubridata还能创建两类对象:期间(Duration)和周期(Period),创建period的辅助函数是unit+s,创建duration的辅助函数是d+unit+s,unit是时间单位,常用的时间单位有:year、month、week、day、hour、minute和second。期间指定的时间跨度位秒的倍数,是固定的秒数。例如,一天的总时间是86 400秒(60 x 60 x 24),一年的总时间是86 400 x 365 (秒),期间类型把一年的天数固定位365天,没有考虑闰年。周期period根据日历来指定时间阔度,这意味着,在把周期添加到一个时间之前,period的确切的时间跨度是不固定的。例如,一年的周期可以是365天,也可以是366天,这取决于它是否是闰年。时间和日期的算术运算,跟期间和周期有关系,经常用到的是周期period类型。

常用的duration类的函数有:

duration(num = NULL, units = "seconds", ...)
is.duration(x)
dseconds(x = )
dminutes(x = )
dhours(x = )
ddays(x = )
dweeks(x = )
dyears(x = )

常用的period类的函数有:

period(num = NULL, units = "second", ...)
is.period(x)
seconds(x = )
minutes(x = )
hours(x = )
days(x = )
weeks(x = )
years(x = )
months(x)

注意,duration类没有dmonths()函数,可能是因为月份持续的天数十分不固定,无法指定一个固定的总时间(秒)。

例1,2分钟的period和duration分别是:

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

例2,对时间加上期间和周期,返回的结果是不同的:

> ymd() + dyears()
[] "2012-12-31"
> ymd() + years()
[] "2013-01-01"

例3,日期的下一个月:

ymd('2018-01-01')+months()

6,日期周期的开始和结束

使用以下两个函数获得日期的开始或结束时间:

floor_date(x, unit = "seconds", week_start = getOption("lubridate.week.start", ))
ceiling_date(x, unit = "seconds", change_on_boundary = NULL, week_start = getOption("lubridate.week.start", ))

例如,获得YTD的开始和结束日期:

ytd_start <- floor_date(Sys.Date(),'year')
ytd_end <- floor_date(Sys.Date(),'month')

参考文档:

Make Dealing with Dates a Little Easier

Do more with dates and times in R

R语言中的时间与日期

R包实践:lubridate 处理时间数据

时间处理–lubridata包

R语言学习 第十一篇:日期和时间的更多相关文章

  1. R语言学习 第四篇:函数和流程控制

    变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...

  2. R语言学习 第八篇:常用的数据处理函数

    Basic包是R语言预装的开发包,包含了常用的数据处理函数,可以对数据进行简单地清理和转换,也可以在使用其他转换函数之前,对数据进行预处理,必须熟练掌握常用的数据处理函数,本文分享在数据处理时,经常使 ...

  3. R语言学习 第十篇:操作符

    运算符是R语言中最基础的存在,熟悉运算符的使用,是熟练使用R处理数据的基础,操作符,顾名思义,是对数据进行运算的符号,R有自己的一套操作符,实现变量的赋值,引用,运算等功能. 一,赋值符号 为变量赋值 ...

  4. R语言学习 第五篇:字符串操作

    文本数据存储在字符向量中,字符向量的每个元素都是字符串,而非单独的字符.在R中,可以使用双引号,或单引号表示字符. 一,字符串中的字符数量 函数nchar()用于获得字符串中的字符数量: > s ...

  5. R语言学习 第三篇:数据框

    数据框(data.frame)是最常用的数据结构,用于存储二维表(即关系表)的数据,每一列存储的数据类型必须相同,不同数据列的数据类型可以相同,也可以不同,但是每列的行数(长度)必须相同.数据框的每列 ...

  6. R语言学习 第七篇:列表

    列表(List)是R中最复杂的数据类型,一般来说,列表是数据对象的有序集合,但是,列表的各个元素(item)的数据类型可以不同,每个元素的长度可以不同,是R中最灵活的数据类型.列表项可以是列表类型,因 ...

  7. R语言学习 第十篇:包

    包(Package)是实现特定功能的.预先写好的代码库(library),通俗地说,包是含有函数.数据等的功能模块.R拥有大量的软件包,许多包都是由某一领域的专家编写的,但并不是所有的包都有很高的质量 ...

  8. Go语言学习笔记十一: 切片(slice)

    Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...

  9. 用R语言提取数据框中日期对应年份(列表转矩阵)

    用R语言提取数据框中日期对应年份(列表转矩阵) 在数据处理中常会遇到要对数据框中的时间做聚类处理,如从"%m/%d/%Y"中提取年份. 对应操作为:拆分成列表——列表转矩阵——利用 ...

随机推荐

  1. 在CSDN开通博客专栏后如何发布文章(图文)

    今天打开电脑登上CSDN发现自己授予了专栏勋章,有必要了解如何在专栏发布文章. 很感谢已经有前辈给出了图文教程,此文章转载自博客:http://blog.csdn.net/upi2u/article/ ...

  2. Spark1.4从HDFS读取文件运行Java语言WordCounts并将结果保存至HDFS

    本次实验相关信息如下: 操作系统:Ubuntu 14 Hadoop版本:2.4.0 Spark版本:1.4.0 运行前提是Hadoop与Spark均已正确安装配置 2.在Linux中生成一个文件tes ...

  3. Touch Handling in Cocos2D 3.x(四)

    创建触摸生命周期 让我们改善我们的应用程序.如果玩家可以触摸屏幕并且拖放英雄到指定位置不是更好吗? 为了完成这个功能我们必须使用Cocos2d 3.0提供的所有的触摸事件: touchBegan:在用 ...

  4. 阿里云服务器实战(二): Linux MySql5.6数据库乱码问题

    在阿里云上了买了一个云服务器, 部署了一个程序,发现插入数据库后乱码了,都成了'????'.  一开始怀疑是Tomcat7的原因 , 见文章 : http://blog.csdn.net/johnny ...

  5. C语言的引用计数与对象树

    引用计数与对象树 cheungmine 2013-12-28 0 引言 我们经常在C语言中,用指针指向一个对象(Object)的结构,也称为句柄(Handle),利用不透明指针的技术把结构数据封装成对 ...

  6. Linux0.11 中对地址的管理

    个字节,段信息无法直接存放在段寄存器中(段寄存器只有2字节).Intel的设计是段描述符集中存放在GDT或LDT中,而段寄存器存放的是段描述符在GDT或LDT内的索引值(index). Linux中逻 ...

  7. Binder和SurfaceFlinger以及SystemServer介绍-android学习之旅(79)

    由于binder机制的存在,使得进程A可以访问进程B中的对象. Android系统Binder机制中的四个组件Client.Server.Service Manager和Binder驱动程序: 1. ...

  8. mysql进阶(五)数据表中带OR的多条件查询

    MySQL数据表中带OR的多条件查询 OR关键字可以联合多个条件进行查询.使用OR关键字时: 条件 1) 只要符合这几个查询条件的其中一个条件,这样的记录就会被查询出来. 2) 如果不符合这些查询条件 ...

  9. android 自定义下拉菜单

    本实例的自定义下拉菜单主要是继承PopupWindow类来实现的弹出窗体,各种布局效果可以根据自己定义设计.弹出的动画效果主要用到了translate.alpha.scale,具体实现步骤如下: 先上 ...

  10. html5标签基础

    1.声明:<!DOCTYPE> HTML有多个不同的版本,只有完全明白页面中使用的确切HTML版本,浏览器才能完全正确的显示出HTML页面,这就是<!DOCTYPE>的用处. ...