R语⾔与格式,⽇期格式,格式转化的操作
R语⾔的基础包中提供了两种类型的时间数据,⼀类是Date⽇期数据,它不包括时间和时区信息,另⼀类是POSIXct/POSIXlt类型数据,其中包括了⽇期、时间和时区信息。
基本总结如下:
⽇期data,存储的是天;
时间POSIXct 存储的是秒,POSIXlt 打散,年⽉⽇不同;
⽇期-时间=不可运算。
⼀般来讲,R语⾔中建⽴时序数据是通过字符型转化⽽来,但由于时序数据形式多样,⽽且R中存贮格式也是五花⼋门,例如
Date/ts/xts/zoo/tis/fts等等。lubridate包(后续有介绍,应⽤四),timeDate包,都有⽤。
常见的格式:
as.numeric转化为数值型
as.logic转化为逻辑型
asplex转化为复数型
as.character转化为字符型
as.array转化为数组
as.data.frame转化为数据框
d<-as.character(z) #将数值向量z<-(0:9)转化为字符向量c("0", "1", "2", ..., "9")。
as.integer(d)        #将d转化为数值向量
e <- numeric()    #产⽣⼀个numeric型的空向量e
a=data.frame(a)  #变成R的数据框
factor()              #变成因⼦可以⽤levels()来看因⼦个数
在data.frame中,是可以实现数据集重命名的,⽐如data.frame(x=iris,y=cars),
也可以实现横向、纵向重命名,data.frame(x=iris,y=cars,row.names=iris)
后续加更内容
应⽤1——如何通过⽣⽇计算年龄
应⽤2——⽇期分组
应⽤三——⽣成按天的时间序列并进⾏回归
应⽤四:灵活处理时间数据—lubridate包(来源TipDM)
应⽤五:如何在循环、函数中,输出实时时间消耗?
时间的标准格式
mydate = as.POSIXlt('2005-4-19 7:01:00')
names(mydate)
默认情况下,⽇期之前是以/或者-进⾏分隔,⽽时间则以:进⾏分隔;
输⼊的标准格式为:⽇期时间(⽇期与时间中间有空隔隔开)
时间的标准格式为:时:分或者时:分:秒;
如果输⼊的格式不是标准格式,则同样需要使⽤strptime函数,利⽤format来进⾏指定。
⼀、⽇期型数据——data
1、as.Data函数
在R中⾃带的⽇期形式为:as.Date();以数值形式存储;
对于规则的格式,则不需要⽤format指定格式;如果输⼊的格式不规则,可以通过format指定的格式读⼊;其中以1970-01-01定义为第0天,之后的年份会以距离这天来计算。
> x<-as.Date("1970-01-01")
> unclass(x)
[1] 0
>
> unclass(as.Date("1970-02-01")) #19700201代表第31天
[1] 31
代码解读:unclass可以将⽇期变成以天来计数,⽐如1970-02-01输出的31,就代表着距离1970-01-01有31天。
as.data中的参数格式:年-⽉-⽇或者年/⽉/⽇;如果不是以上⼆种格式,则会提供错误——错误于charTo按照Date(x) : 字符串的格式不够标准明确;
例如这样的数据格式,就常常报错。
19:15.
显⽰为:2011/1/1 19:15
as.Date('23-2013-1',format='%d-%Y-%m')
#其中这个%d%Y可以节选其中⼀个
#%Y%y  ⼤写代表年份四位数,⼩写代表年份⼆位数,要注意
2、%d%y%m-基本格式
格式意义
%d⽉份中当的天数
%m⽉份,以数字形式表⽰
%b⽉份,缩写
%B⽉份,完整的⽉份名,指英⽂
%y年份,以⼆位数字表⽰
%Y年份,以四位数字表⽰
#其它⽇期相关函数
weekdays()取⽇期对象所处的周⼏;
months()取⽇期对象的⽉份;
quarters()取⽇期对象的季度。
⼆、时间型——POSIXct与POSIXlt
POSIXct 是以1970年1⽉1号开始的以秒进⾏存储,如果是负数,则是1970-01-01年以前;正数则是1970年以后。
POSIXlt 是以列表的形式存储:年、⽉、⽇、时、分、秒,作⽤是打散时间;
1、POSIXlt 格式
主要特点:作⽤是打散时间,把时间分成年、⽉、⽇、时、分、秒,并进⾏存储。
可以作为时间筛选的⼀种。
> today<-Sys.time()
> unclass(as.POSIXlt(today))
$sec
[1] 53.27151
$min
[1] 38
$hour
[1] 20
$mday
[1] 6
$mon
[1] 5
$year
[1] 116
$wday
[1] 1
$yday
[1] 157
$isdst
[1] 0
$zone
[1] "CST"
$gmtoff
[1] 28800
attr(,"tzone")
[1] ""    "CST" "CDT"
代码解读:unclass将时间打散。
2、POSIXct 格式
主要特点:以秒进⾏存储。
> today<-Sys.time()
> today
[1] "2016-06-06 20:42:22 CST"
> unclass(as.POSIXct(today))
[1] 1465216942
解读:⽐如今天,unclass之后,代表今天2016-06-06距离1970-01-01为1465216942秒。
#GMT代表时区,德意志时间,CST也代表时区
三、时间运算
1、基本运算函数
Sys.Date()                #字符串类型
typeof(Sys.Date())  #系统⽇期类型
2、直接加减
相同的格式才能相互减,不能加。⼆进列的+法对"Date"、"POSIXt"对象不适⽤。
> as.Date("2011-07-01") - as.Date(today)
Time difference of -1802 days
> as.POSIXct(today)-as.POSIXct(as.Date("2012-10-25 01:00:00"))
Time difference of 1320.529 days
> as.POSIXlt(today)-as.POSIXlt(as.Date("2012-10-25 01:00:00"))
Time difference of 1320.529 days
相互减之后,⼀般结果输出的天数。
3、difftime函数——计算时差
不同格式的时间都可以进⾏运算。并且可以实现的是计算两个时间间隔:秒、分钟、⼩时、天、星期。
但是不能计算年、⽉、季度的时间差。
gtd <- as.Date("2011-07-01")
difftime(as.POSIXct(today), gtd, units="hours")    #只能计算⽇期差,还可以是“secs”, “mins”, “hours”, “days”
4、format函数——提取关键信息
> today<-Sys.time()
> format(today,format="%B-%d-%Y")
[1] "六⽉-06-2016"
format函数可以将时间格式,调节成指定时间样式。format(today,format="%Y")其中的format可以⾃由调节,获取你想要的时间信息。并且format函数可以识别as.Data型以及POSIXct与POSIXlt型,将其⽇期进⾏提取与之后要讨论的split类型。
> today<-Sys.time()
> format(as.Date(today),format="%Y")
[1] "2016"
> format(as.POSIXlt(today),format="%Y")
[1] "2016"
> format(as.POSIXct(today),format="%Y")
[1] "2016"
但是format出来的时间不能直接做减法,会出现错误: non-numeric argument to binary operator
5、strptime函数
该函数是将字符型时间转化为 "POSIXlt" 和"POSIXct"两类。跟format⽐较相似。
strptime之后的时间是可以直接做减法,因为直接是"POSIXlt" 和"POSIXct"格式了。
> strptime("2006-01-08 10:07:52", "%Y-%m-%d")-strptime("2006-01-15 10:07:52", "%Y-%m-%d")
Time difference of -7 days
> class(strptime("2006-01-08 10:07:52", "%Y-%m-%d"))
[1] "POSIXlt" "POSIXt"
四、遇见的问题
1、常常报错。
错误于charTo按照Date(x) : 字符串的格式不够标准明确。这个错误经常出现,我本来的数据格式是
19:15.
后来换成“2011/1/1”这样的就不会报错了,需要数据库⾃动改变。
#⼏种错误汇总
dtV<-data.frame(as.POSIXct(a$b,format="%d.%m.%Y")) #错,读出来都是NA
as.Date(a$b, "%Y年%m⽉%d⽇")  #错,读不出来
as.POSIXct(strptime(a$b, "%Y-%m-%d"))  #读不出来
#转化成xts格式也读不出来
install.packages("xts")
library(xts)
<("time.csv",header=T))
a <- as.xts(a, descr='my new xts object')
<("a.csv",header=T))
#错
#转化成数值型也不对
c=as.numeric(sales[,2])
2、excel另存为csv时发⽣的错误。
⼀位⽹友说:我以前是在excel⾥另存为csv格式,百度上说CSV档如果以EXCEL开启,由于计算机档案数据转换的原因,会将其CRC之数值改做科学记号⽅式储存,⽽造成档案中的 CRC值发⽣错误。
应⽤1——如何通过⽣⽇计算年龄
1、format函数
timeformat<-function(x){
format(as.POSIXct(x),format="%Y")
}
sapply(as.Date(data$birthdate),timeformat)
format只能⼀个⼀个操作,可以先写成函数,然后计算得出年份,之后⽤如今的年份相减得到年龄。
2、字符型——strsplit
先转化为字符型,然后进⾏分割。
data.frame(sapply(as.character(data$birthdate),function(x){strsplit(x,"-")[[1]][1]}))
日期字符串是什么注意,其中strsplit中的"-",根据具体时间格式情况来定义。
应⽤2——⽇期分组
⼀种按照⽇期范围——例如按照周、⽉、季度或者年——对其进⾏分组的超简便处理⽅式:R语⾔的cut()函数。
假设vector中存在以下⽰例数据:
vDates <- as.Date(c("2013-06-01", "2013-07-08", "2013-09-01", "2013-09-15")) #as.Data()函数的作⽤⾮常重要;如果没有它,R语⾔会认为以上内容仅仅是数字串⽽⾮⽇期对象 [1] "2013-06-01" "2013-07-08" "2013-09-01" "2013-09-15"
vDates.bymonth <- cut(vDates, breaks = "month")
[1] 2013-06-01 2013-07-01 2013-09-01 2013-09-01
Levels: 2013-06-01 2013-07-01 2013-08-01 2013-09-01
Dates <- data.frame(vDates, vDates.bymonth)
应⽤三——⽣成按天的时间序列并进⾏回归
如果是⽣成简单的年度,⽉度数据,ts函数可以满⾜,但是如果⽣成的是每天。因为有闰年缘故,所以zoo包可以很好地解决这个问题。
还有笔者在做⼀个简单的时间序列回归时候,疑惑:
做关于时间序列的ols最⼩⼆乘法回归⽅程,按年来好说,但是如果是按天,如果进⾏计算呢?
1、把天变成⼀排规律递增的数字来代替;
2、ts函数变化之后,也是变成⼀个递增的数字。
以上两种,做的结果都⼀样,所以没有什么太⼤的区别。
关于ts函数by day每⼀天的时间序列⽣成,该如何呢?
n=30
t<-ts(1:n,frequency=1,start=as.Date("2010-01-09"))
⽣成⼀个按天的时间序列。
应⽤四:灵活处理时间数据—lubridate包(来源TipDM)
lubridate包是由Garrett Grolemund 和 Hadley Wickham写的,可以灵活地处理时间数据。lubridate包主要有两类函数,⼀类是处理时点数据(time instants),另⼀类是处理时段数据(time spans)。
1、时点类函数
主要包括解析、抽取、修改。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。