R语言中提供了三种日期和时间处理:
一、系统当前的日期和时间
注意:R还有一个函数date(),用于返回当前时间对应的文本
> 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则给出了用于读入日期的适当格式
日期值的默认输入格式为yyyy-mm-dd。如果字符串形式的日期格式是日期值默认的输入格式则参数input_format可以不写
> 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指出字符串形式的日期格式例子
> 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( ) 。常用的时间格式符号是:
> 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")第一个参数是日期值,第二个参数是指定的要输出的日期的格式或者想要提取的部分
> today <- Sys.Date()
> #把日期以非缩写月份/数字表示的日期/四位数的年份的格式输出
> format(today, format="%B/%d/%Y")
[1] "十一月/04/2020"
> # 提取日期的非缩写星期名
> format(today, format="%A")
[1] "星期三"
4、计算时间间隔
1):R的内部在存储日期时,是使用1970年1月1日以来的天数表示的,更早的日期则表示为负数。这样两个日期值就可以相减,而所得到的的结果就是两个日期值相差的天数
> 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)。
> 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()将日期值转为字符型
> 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类不同混合加减两者的数值代表不同的含义。这意味着可以在日期值上执行比较运算符合算术运算:
> 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)
#安装和载入lubridate包
install.packages("lubridate")
library(lubridate)
> 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。
> 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
> x <-ymd("2010-04-09")
> date(x)
[1] "2010-04-09"
> month(x)
[1] 4
> day(x)
[1] 9
设置当前时间月份为6月
> x
[1] "2020-11-04 20:54:08 CST"
> month(x) <-6
> x
[1] "2020-06-04 20:54:08 CST"
为了处理时区信息,lubridate包提供了三个函数 :
> 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", ...)
> 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)
> ymd(20120101) + years(1)
[1] "2013-01-01"
> ymd(20120101) + months(1)
[1] "2012-02-01"
> ymd(20120101) + days(1)
[1] "2012-01-02"