前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言 日期、时间和lubridate包

R语言 日期、时间和lubridate包

作者头像
拴小林
发布2020-11-11 16:14:29
5.5K0
发布2020-11-11 16:14:29
举报
文章被收录于专栏:数据驱动实践数据驱动实践

R语言中提供了三种日期和时间处理

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

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

  • Sys.Date()可以返回当天的日期
  • date()可以返回当天的日期和时间
  • Sys.time() 可以返回当天的时间

注意:R还有一个函数date(),用于返回当前时间对应的文本

代码语言:javascript
复制
> Sys.Date()
[1] "2020-11-04"
> date()
[1] "Wed Nov 04 19:56:49 2020"
> 
> #Sys.time() 可以返回当天的时间
> Sys.time()
[1] "2020-11-04 19:56:49 CST"
> 
> #R还有一个函数date(),用于返回当前时间对应的文本,只不过格式比较怪
> date()
[1] "Wed Nov 04 19:56:49 2020"

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

1、as.Date()

当导入数据时日期值通常以字符串的形式输入到R中,这时需要转化为以数值形式存储的日期变量。用as.Date()把文本转换为Date类型:其语法为as.Date(x,"input_format"),其中x是字符型数据,#input_format则给出了用于读入日期的适当格式

  • %d 数字表示的日期(1-31)
  • %a 缩写的星期名
  • %A 非缩写的星期名
  • %m 月份
  • %b 缩写的月份
  • %B 非缩写的月份
  • %y 两位数的年份
  • #%Y 四位数的年份

日期值的默认输入格式为yyyy-mm-dd。如果字符串形式的日期格式是日期值默认的输入格式则参数input_format可以不写

代码语言:javascript
复制
> mydates <- as.Date(c("2017-08-22","2014-03-11"))
> mydates
[1] "2017-08-22" "2014-03-11"

# 对比如下
> mydates <- as.Date(c("2017-06-22","2014-03-13"),"%Y-%m-%d")
> mydates
[1] "2017-06-22" "2014-03-13"

当字符串形式的日期格式不是默认的输入格式时,需要通过参数input_format指出字符串形式的日期格式例子

代码语言:javascript
复制
> strDates <- c("01/04/1965","08/16/1975")
> dates <- as.Date(strDates,"%m/%d/%Y")
> dates
[1] "1965-01-04" "1975-08-16"

2、strptime()解析日期

函数strptime( )是string parse time的简称,返回POSIXlt日期(即以列表的形式存储日期和时间),在解析时必须制定文本和日期对应的位置,日期的格式使用%+字母来指定。strptime(x,format="",tz=""),参数tz是时区(time zone),默认是空,在解析时,如果不指定时区,R会调用Sys.timezone( ) 。常用的时间格式符号是:

  • %H:小时(24小时制)
  • %I:小时(12小时制)
  • %p:对于12小时制,指定上午(AM)或下午(PM)
  • %M:分钟
  • %S:秒
  • Sys.time() #返回现在的时间
  • strftime(x,"%y/%m/%d %H:%M:%S") #把时间格式转换为字符串格式
  • strptime(x,"%y/%m/%d %H:%M:%S") #把字符串格式转换为时间格式
代码语言:javascript
复制
> nowstr <- Sys.time() #返回现在的时间
> nowstr
[1] "2020-11-04 20:13:18 CST"
> nowstr <- strftime(nowstr,"%y/%m/%d %H:%M:%S")  #把时间格式转换为字符串格式
> nowstr
[1] "20/11/04 20:13:18"
> nowtime <- strptime(nowstr,"%y/%m/%d %H:%M:%S")   #把字符串格式转换为时间格式
> nowtime
[1] "2020-11-04 20:13:18 CST"

3、format()

format()函数可以把默认的日期格式转换成自己指定的格式的日期值,还可以提取日期值的某一部分。format(x, format="output_format")第一个参数是日期值,第二个参数是指定的要输出的日期的格式或者想要提取的部分

代码语言:javascript
复制
> today <- Sys.Date() 

> #把日期以非缩写月份/数字表示的日期/四位数的年份的格式输出 
> format(today, format="%B/%d/%Y")
[1] "十一月/04/2020"

> # 提取日期的非缩写星期名 
> format(today, format="%A")
[1] "星期三"

4、计算时间间隔

1):R的内部在存储日期时,是使用1970年1月1日以来的天数表示的,更早的日期则表示为负数。这样两个日期值就可以相减,而所得到的的结果就是两个日期值相差的天数

代码语言:javascript
复制
> startdate <- as.Date("2015-11-03")
> enddate <- as.Date("2016-11-03")
> #显示两个日期间隔的天数
> days <- enddate - startdate
> days
Time difference of 366 days

2):difftime()用来计算两个日期值的时间间隔,并可以以星期,天,时,分,表等方式来表示。difftime(x,y,units)第一个参数表示用来去减的数,第二个参数是被减数,第三个参数是时间间隔显示方式,units可以是"auto"、"secs"、"mins"、"hours"、"days"、"weeks"(默认days)。

代码语言:javascript
复制
> today <- Sys.Date()
> dob <- as.Date("1992-05-18")
> difftime(today,dob)
Time difference of 10397 days

> difftime(today,dob,units="days")
Time difference of 10397 days

> difftime(today,dob,units="auto")
Time difference of 10397 days

> difftime(today,dob,units="secs")
Time difference of 898300800 secs

将日期转换为字符型变量,使用as.character()将日期值转为字符型

代码语言:javascript
复制
> dates=c("2018-02-15","2019-03-15")
> dates <- as.Date(dates,format="%Y-%m-%d" )
> strDates <- as.character(dates)
> str(strDates)
 chr [1:2] "2018-02-15" "2019-03-15"

3):由于POSIXct类是以秒为单位来计算时间,Date类是以天为单位类计算时间日期和POSIXct都是通过转换为天数或秒数的数值所以可以把他们当做数值进行加减

一种方式是两个日期值相互加减,第二种方式是日期值加减一个数值,Date类和POSIXct类不同混合加减两者的数值代表不同的含义。这意味着可以在日期值上执行比较运算符合算术运算:

  • 将数字和Date类相加,增加或减少相应的天数
  • 将数字和POSIXct类相加,增加或减少相应的秒数。时间与数字相加,时间以秒为单位
  • 由于Date类和POSIXct类实际上都是一个整数,可以直接比较大小
代码语言:javascript
复制
> time1 <- Sys.time()
> print(time1)
[1] "2020-11-04 20:38:49 CST"
> print(time1 + 60*60) #增加了一个小时
[1] "2020-11-04 21:38:49 CST"

> #日期与数字相加,日期以天为单位:
> date1 <- Sys.Date()
> print(date1)
[1] "2020-11-04"
> print(date1 +1)
[1] "2020-11-05"

四:lubridate包介绍

lubridate包使得日期和时间处理更加规范,简单和灵活。lubridate中所有解析函数都会返回POSIXct日期,默认都是用UTC时区。lubridate包主要有两类函数,一类是处理时点数据(time instants), 另一类是处理时段数据(time spans)

代码语言:javascript
复制
#安装和载入lubridate包
install.packages("lubridate")
library(lubridate)
  • 系统的当前时间lubridate::now(),和Sys.time()函数返回的时间相同
  • 系统的当前日期lubridate::today(),和Sys.Date()函数返回的日期相同;
代码语言:javascript
复制
> now()
[1] "2020-11-04 20:47:55 CST"
> 
> today()
[1] "2020-11-04"

lubridate从字符串转换为日期类型。ymd()函数用于从字符型数据解析时间,该函数会自动识别各种分隔符,函数的定义是:ymd(...,quiet = FALSE,tz=NULL)。参数注释

quiet:布尔型,当指定为TRUE时,移除文本中自定义的文本;tz: 时区,默认为NULL;ymd代表文本的格式必须依次是;year、month、day、除了ymd外还有ydm,mdy,myd,dmy,dym。

代码语言:javascript
复制
> x <-ymd("2010-04-09")
> x
[1] "2010-04-09"
> x
[1] "2010-04-09"
> str(x)
 Date[1:1], format: "2010-04-09"

抽取或设置时间部分。date:抽取或设置时间的日期,类似的还有year,month,day ,week,hour,minute,second

代码语言:javascript
复制
> x <-ymd("2010-04-09")
> date(x)
[1] "2010-04-09"
> month(x)
[1] 4
> day(x)
[1] 9

设置当前时间月份为6月

代码语言:javascript
复制
> x
[1] "2020-11-04 20:54:08 CST"
> month(x) <-6
> x
[1] "2020-06-04 20:54:08 CST"

为了处理时区信息,lubridate包提供了三个函数 :

  • tz: 提取数据数据的时区 tz(today())
  • with_tz:将时间数据转换为另一个时区的同一时间,时间值改变但是时间不变
  • force_tz;将时间数据的时区强制转换为另一个时区,时间值不变但是时间会变
代码语言:javascript
复制
> times <- now(tzone = "UTC") 
> 
> with_tz(times,tz="America/Chicago") 
[1] "2020-11-04 06:57:00 CST"
> 
> times
[1] "2020-11-04 12:57:00 UTC"

时间的运算

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)
代码语言:javascript
复制
> x <- ymd_hms("2009-08-03 00:00:00", tz="America/Chicago")
> x + ddays(1) + dhours(6) + dminutes(30)
[1] "2009-08-04 06:30:00 CDT"
> x + ddays(100) - dhours(8)
[1] "2009-11-10 15:00:00 CST"

常用的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)

#对时间加上期间和周期,返回的结果是不同的:ymd(20120101) + dyears(1)

代码语言:javascript
复制
> ymd(20120101) + years(1)
[1] "2013-01-01"
> ymd(20120101) + months(1)
[1] "2012-02-01"
> ymd(20120101) + days(1)
[1] "2012-01-02"
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据驱动实践 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档