#日期和时间
#R语言的基础包中提供了三种基本类型用于处理日期和时间,Date用于处理日期,它不包括时间和时区信息;、
#POSIXct/;PSIXlt用于处理日期和时间,其中包括日期,时间,时区信息。R内部在存储日期和时间时,使用不同的方式;
#Date类:存储了从1970年1月1日以来来时计算的天数,更早的日期表示为负数,也就是说,Date类型是一个整数
#以天为单位计算日期,因此Date适合计算日期
#POSIXct类:记录了以时间标准时间时区(UTC)为准的,从1970年1月1日开始时的秒数,即POSIXct类型是整数,
#以秒为单位计算时间,因此,POSIXct最适合用于存储和计算时间。
#POSIXlt:把日期和时间存储为一个列表,其中包括秒,分,时和月份等,POSIXlt是使用列表来表示日期和时间,
#因此POSIXlt最适合用来提取日期中的特定部分
#一,系统当前的日期和时间
#Sys.Date()可以返回当天的日期
#date()可以返回当天的日期和时间
Sys.Date()
date()
#Sys.time() 可以返回当天的时间
Sys.time()
#R还有一个函数date(),用于返回当前时间对应的文本,只不过格式比较怪
date()
#二,把文本解析成日期和时间
#当导入数据时日期值通常以字符串的形式输入到R中,这时需要转化为以数值形式存储的日期变量
#1,用as.Date()把文本转换为Date类型:
#函数as.Date()用于执行这种转化。其语法为as.Date(x,"input_format"),其中x是字符型数据,
#input_format则给出了用于读入日期的适当格式
#%d 数字表示的日期(1-31)
#%a 缩写的星期名
#%A 非缩写的星期名
#%m 月份
#%b 缩写的月份
#%B 非缩写的月份
#%y 两位数的年份
#%Y 四位数的年份
#日期值的默认输入格式为yyyy-mm-dd。如果字符串形式的日期格式是日期值默认的输入格式则参数input_format可以不写
mydates <- as.Date(c("2017-06-22","2014-03-13"))
mydates
#当字符串形式的日期格式不是默认的输入格式时,需要通过参数input_format指出字符串形式的日期格式例子
strDates <- c("01/05/1965","08/16/1975")
dates <- as.Date(strDates,"%m/%d/%Y")
dates
#修改leadership数据中的日期是字符型变量,转换为数值型的日期变量
myformat <- "%m/%d/%y"
leadership$date <- as.Date(leadership$date,myformat)
leadership$date
a <- c("10/1/18","10/8/18")
b <- as.Date(a,"%m/%d/%y")
a <- c("2/23/15","3/2/17")
b <- as.Date(a,"%m/%d/%y")
b
#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:秒
#例子
nowstr <- Sys.time() #返回现在的时间
nowstr <- strftime(nowstr,"%y/%m/%d %H:%M:%S") #把时间格式转换为字符串格式
nowtime <- strptime(nowstr,"%y/%m/%d %H:%M:%S") #把字符串格式转换为时间格式
print(nowtime)
#format()函数可以把默认的日期格式转换成自己指定的格式的日期值,还可以提取日期值的某一部分
#format(x, format="output_format")第一个参数是日期值,第二个参数是指定的要输出的日期的格式或者想要提取的部分
today <- Sys.Date()
#把日期以非缩写月份/数字表示的日期/四位数的年份的格式输出
format(today, format="%B/%d/%Y")
#提取日期的非缩写星期名
format(today, format="%A")
#计算时间间隔
#R的内部在存储日期时,是使用1970年1月1日以来的天数表示的,更早的日期则表示为负数。
#这样两个日期值就可以相减,而所得到的的结果就是两个日期值相差的天数
startdate <- as.Date("2015-11-03")
enddate <- as.Date("2016-11-03")
#显示两个日期间隔的天数
days <- enddate - startdate
days
#difftime()用来计算两个日期值的时间间隔,并可以以星期,天,时,分,表等方式来表示。
#difftime(x,y,units)第一个参数表示用来去减的数,第二个参数是被减数,第三个参数是时间间隔显示的方式
#第三个参数units可以是"auto","secs","mins","hours","days","weeks"
?difftime()
#例子计算年龄
today <- Sys.Date()
dob <- as.Date("1992-11-23")
difftime(today,dob,units="days")
difftime(today,dob,units="auto")
difftime(today,dob,units="secs")
#将日期转换为字符型变量。
#1,使用as.character()将日期值转为字符型
dates=c("2018-2-15","2019-3-15")
dates <- as.Date(dates,format="%Y-%m-%d" )
strDates <- as.character(dates)
#2,format()把日期转换为文本
#format()函数的定义是:
format(x,format = "", tz="")
#x是日期参数,format是输出格式,tz是时区,该函数按照指定的格式输入文本
today <- Sys.Date()
mydate <- format(today,format="%Y%m%d")
mydate
#3,strftime()格式化日期
#函数strftime(),是string formated time的简称,用于把时间转化为字符串,
strftime(x, format, tz="")
#该函数和format()函数的功能和使用方法几乎完全相同
today <- Sys.Date()
mydate <- strftime(today,format="%m-%d-%y")
mydate
#日期的比较
#由于POSIXct类是以秒为单位来计算时间,Date类是以天为单位类计算时间
#日期和POSIXct都是通过转换为天数或秒数的数值所以可以把他们当做数值进行加减,
#一种方式是两个日期值相互加减,第二钟方式是日期值加减一个数值,
#Date类和POSIXct类不同混合加减两者的数值代表不同的含义
#这意味着可以在日期值上执行比较运算符合算术运算:
#1,将数字和Date类相加,增加或减少相应的天数
#2,将数字和POSIXct类相加,增加或减少相应的秒数。
#1,时间和数字相加
#时间与数字相加,时间以秒为单位
time1 <- Sys.time()
print(time1)
print(time1 + 60*60) #增加了一个小时
#日期与数字相加,日期以天为单位:
date1 <- Sys.Date()
print(date1)
print(date1 +1)
#2,时间比较
#由于Date类和POSIXct类实际上都是一个整数,可以直接比较大小
date1 <- as.Date("2018-10-11")
date2 <- as.Date("2018-11-11")
if (date2 > date1) print("gt")
date2-date1
#五,lubridate包介绍
#lubridate包使得日期和时间处理更加规范,简单和灵活。lubridate中所有解析函数都会返回POSIXct日期,
#默认都是用UTC时区
#lubridate包主要有两类函数,一类是处理时点数据(time instants), 另一类是处理时段数据(time spans)
#安装和载入lubridate包
install.packages("lubridate")
library(lubridate)
#1,系统的当前时间now(),和Sys.time()函数返回的时间相同;
#系统的当前日期today(),和Sys.Date()函数返回的日期相同;
now()
today()
#2,从字符串转换为日期类型
#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")
#3,从字符类型转换为时间类型
#ymd_hms()函数用于把文本解析为时间,该函数会自动识别各种分隔符
ymd_hms(...,quiet = FALSE,tz="UTC")
#3,抽取或设置时间部分
#date:抽取或设置时间的日期,类似的还有year,month,day ,week,hour,minute,second
#例子,抽取当前时间的月份
month(now())
#设置当前时间月份为6月
x <- now()
month(x) <-6
x
#时区
#为了处理时区信息,lubridate包提供了三个函数
#tz: 提取数据数据的时区
tz(today())
#with_tz:将时间数据转换为另一个时区的同一时间,时间值改变但是时间不变
#force_tz;将时间数据的时区强制转换为另一个时区,时间值不变但是时间会变
times <- now(tzone = "UTC")
with_tz(times,tz="America/Chicago")
times
#时间间隔(intervals)
#时间间隔是由开始时间和结束时间构成的对象,本身用途不大,最常用于指定期间和周期
a <- interval(ymd("20111123"),ymd("20121123"))
a
#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()函数,可能是因为月份持续的天数十分不固定,无法指定一个固定的总时间(秒)。
#对时间加上期间和周期,返回的结果是不同的:
ymd(20120101) + dyears(1)
ymd(20120101) + years(1)