标签: R 日期格式日期差代码时间处理
分类:目录(?)[+]
R语言与格式、日期格式、格式转化
2016­02­16 22:12 1624人阅读 评论(0) 收藏 举报
版权声明:本文为博主原创文章,未经博主允许不得转载。
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 转化为数据框
在data.frame中,是可以实现数据集重命名的,比如data.frame(x=iris,y=cars),
也可以实现横向、纵向重命名,data.frame(x=iris,y=cars,row.names=iris)
——————————————————————————————————————————
时间的标准格式
mydate = as.POSIXlt(’2005-4-19 7:01:00’)names(mydate)
默认情况下,日期之前是以/或者-进行分隔,而时间则以:进行分隔;
输入的标准格式为:日期 时间(日期与时间中间有空隔隔开)
R的数据读入与基础(1)(20)
[plain] view plain  copy  print ?
01. d<‐as.character(z) #将数值向量z<‐(0:9)转化为字符向量c("0", "1", "2", ..., "9")。
02. as.integer(d)        #将d 转化为数值向量
03. e <‐ numeric()    #产生一个numeric 型的空向量e
04. a=data.frame(a)  #变成R 的数据框
05. factor()              #变成因子  可以用levels()来看因子个数
时间的标准格式为:时:分 或者 时:分:秒;
如果输入的格式不是标准格式,则同样需要使用strptime函数,利用format来进行指定。
——————————————————————————————————————————
一、日期型数据——data
1、as.Data函数
在R中自带的日期形式为:as.Date();以数值形式存储;
对于规则的格式,则不需要用format指定格式;如果输入的格式不规则,可以通过format指定的格式读入;其中以1970-01-01定义为第0天,之后的年份会以距离这天来计算。
代码解读:unclass可以将日期变成以天来计数,比如1970-02-01输出的31,就代表着距离1970-01-01有31天。
as.data中的参数格式:年-月-日或者年/月/日;如果不是以上二种格式,则会提供错误——错误于charT
o按照Date(x) : 字符串的格式不够标准明确;
例如这样的数据格式,就常常报错。
19:15.
显示为:2011/1/1 19:15
2、%d%y%m-基本格式
格式
意义%d
月份中当的天数%m
月份,以数字形式表示%b
月份,缩写%B
月份,完整的月份名,指英文%y 年份,以二位数字表示
[html] view plain  copy  print ?
01.
> x <‐as.Date ("1970‐01‐01")  02.
> unclass(x)  03.
[1] 0  04.
>  05.
> unclass(as.Date("1970‐02‐01")) #19700201代表第31天  06. [1] 31
[plain] view plain  copy  print ?
01.
as.Date('23‐2013‐1',format='%d‐%Y‐%m')    02.
#其中这个%d%Y 可以节选其中一个  03. #%Y%y  大写代表年份四位数,小写代表年份二位数,要注意
%Y 年份,以四位数字表示
#其它日期相关函数
weekdays()取日期对象所处的周几;
months()取日期对象的月份;
quarters()取日期对象的季度。
————————————————————————————————————————
二、时间型——POSIXct与POSIXlt
POSIXct 是以1970年1月1号开始的以秒进行存储,如果是负数,则是1970-01-01年以前;正数则是1970年以后。POSIXlt 是以列表的形式存储:年、月、日、时、分、秒,作用是打散时间;
1、POSIXlt 格式
主要特点:作用是打散时间,把时间分成年、月、日、时、分、秒,并进行存储。
可以作为时间筛选的一种。
代码解读:unclass将时间打散。
[html] view plain  copy  print ?
01. > today <‐Sys.time ()
02. > unclass(as.POSIXlt(today))
03. $sec
04. [1] 53.27151
05.
06. $min
07. [1] 38
08.
09. $hour
10. [1] 20
11.
12. $mday
13. [1] 6
14.
15. $mon
16. [1] 5
17.
18. $year
19. [1] 116
20.
21. $wday
22. [1] 1
23.
24. $yday
25. [1] 157
26.
27. $isdst
28. [1] 0
29.
30. $zone
31. [1] "CST"
32.
33. $gmtoff
34. [1] 28800
35.
36. attr(,"tzone")
37. [1] ""    "CST" "CDT"
2、POSIXct 格式
主要特点:以秒进行存储。
解读:比如今天,unclass之后,代表今天2016-06-06距离1970-01-01为1465216942秒。
#GMT代表时区,德意志时间,CST也代表时区
————————————————————————————————————————
三、时间运算
1、基本运算函数
Sys.Date()                #字符串类型
typeof(Sys.Date())  #系统日期类型
2、直接加减
相同的格式才能相互减,不能加。二进列的+法对"Date"、"POSIXt"对象不适用。
相互减之后,一般结果输出的天数。
3、difftime函数——计算时差
不同格式的时间都可以进行运算。并且可以实现的是计算两个时间间隔:秒、分钟、小时、天、星期。但是不能计算年、月、季度的时间差。
[html] view plain  copy  print ?
01. > today <‐Sys.time ()
02. > today
03. [1] "2016‐06‐06 20:42:22 CST"日期字符串是什么
04. > unclass(as.POSIXct(today))
05. [1] 1465216942
[html] view plain  copy  print ?
01. > as.Date("2011‐07‐01") ‐ as.Date(today)
02. Time difference of ‐1802 days
03. > as.POSIXct(today)‐as.POSIXct(as.Date("2012‐10‐25 01:00:00"))
04. Time difference of 1320.529 days
05. > as.POSIXlt(today)‐as.POSIXlt(as.Date("2012‐10‐25 01:00:00"))
06. Time difference of 1320.529 days
[html] view plain  copy  print ?
01. gtd <‐ as.Date("2011‐07‐01")
02. difftime(as.POSIXct(today), gtd, units ="hours")    #只能计算日期差,还可以是“secs”, “mins”, “hours”, “days”
4、format函数——提取关键信息
format函数可以将时间格式,调节成指定时间样式。format(today,format="%Y")其中的format可以自由调节,获取你想要的时间信息。并且format函数可以识别as.Data型以及POSIXct与POSIXlt型,将其日期进行提取与之后要讨论的split类型。
但是format出来的时间不能直接做减法,会出现错误: non-numeric argument to binary operator
5、strptime函数
该函数是将字符型时间转化为 "POSIXlt" 和"POSIXct"两类。跟format比较相似。
strptime之后的时间是可以直接做减法,因为直接是"POSIXlt" 和"POSIXct"格式了。
————————————————————————————————————————
四、遇见的问题
1、常常报错。
错误于charTo按照Date(x) : 字符串的格式不够标准明确。这个错误经常出现,我本来的数据格式是19:15.
后来换成“2011/1/1”这样的就不会报错了,需要数据库自动改变。
[html] view plain  copy  print ?
01. > today <‐Sys.time ()
02. > format(today,format ="%B‐%d‐%Y")
03. [1] "六月‐06‐2016"
[html] view plain  copy  print ?
01. > today <‐Sys.time ()
02. > format(as.Date(today),format ="%Y")
03. [1] "2016"
04. > format(as.POSIXlt(today),format ="%Y")
05. [1] "2016"
06. > format(as.POSIXct(today),format ="%Y")
07. [1] "2016"
[html] view plain  copy  print ?
01. > strptime("2006‐01‐08 10:07:52", "%Y‐%m‐%d")‐strptime("2006‐01‐15 10:07:52", "%Y‐%m‐%d")
02. Time difference of ‐7 days
03. > class(strptime("2006‐01‐08 10:07:52", "%Y‐%m‐%d"))
04. [1] "POSIXlt" "POSIXt"

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