zoukankan      html  css  js  c++  java
  • R学习 第八篇:日期和时间

    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()
    [1] "2018-05-07"
    > Sys.time()
    [1] "2018-05-07 22:11:45 CST"

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

    > date()
    [1] "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)
    [1] "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)
    [1] "2018-05-08 13:16:36 CST"
    > print(time1+60*60)
    [1] "2018-05-08 14:16:36 CST"

    日期以天为单位:

    > date1 <- Sys.Date()
    > print(date1)
    [1] "2018-05-08"
    > print(date1+1)
    [1] "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())
    [1] 5

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

    x< now()
    month(x) <- 6

    4,时间间隔(Intervals)

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

    auckland <- interval(arrive, leave) 
    auckland
    #> [1] 2011-06-04 12:00:00 NZST--2011-08-10 14:00:00 NZST
    auckland <- arrive %--% leave
    auckland
    #> [1] 2011-06-04 12:00:00 NZST--2011-08-10 14:00:00 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 = 1)
    dminutes(x = 1)
    dhours(x = 1)
    ddays(x = 1)
    dweeks(x = 1)
    dyears(x = 1)

    常用的period类的函数有:

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

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

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

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

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

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

    例3,日期的下一个月:

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

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

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

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

    例如,获得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包

  • 相关阅读:
    M1卡的工作原理【转】
    磁卡ID卡IC卡的区别【转】
    磁卡结构【转】
    M1卡破解(自从学校升级系统之后,还准备在研究下)【转】
    RunJS演示代码
    Linux中inet_aton的问题(IP转整数)
    使用Hive UDF和GeoIP库为Hive加入IP识别功能
    hive下UDF函数的使用
    linux下smb
    使用Spring MVC表单标(转)
  • 原文地址:https://www.cnblogs.com/ljhdo/p/4804113.html
Copyright © 2011-2022 走看看