标签: R 日期格式日期差代码时间处理分类:目录(?)[+]R语言与格式、日期格式、格式转化20160216 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 转化为逻辑型plex 转化为复数型as.character 转化为字符型as.array 转化为数组as.data.frame 转化为数据框在data.frame中,是可以实现数据集重命名的,比如data.frame(x=iris,y=cars),也可以实现横向、纵向重命名,data.frame(x=iris,y=cars,s=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 型的空向量e04. a=data.frame(a) #变成R 的数据框05. factor() #变成因子 可以用levels()来看因子个数时间的标准格式为:时:分 或者 时:分:秒;如果输入的格式不是标准格式,则同样需要使用strptime函数,利用format来进行指定。
——————————————————————————————————————————一、日期型数据——data1、as.Data函数在R中自带的日期形式为:as.Date();以数值形式存储;对于规则的格式,则不需要用format指定格式;如果输入的格式不规则,可以通过format指定的格式读入;其中以1970-01-01定义为第0天,之后的年份会以距离这天来计算。
代码解读:unclass可以将日期变成以天来计数,比如1970-02-01输出的31,就代表着距离1970-01-01有31天。
as.data中的参数格式:年-月-日或者年/月/日;如果不是以上二种格式,则会提供错误——错误于charTo按照Date(x) : 字符串的格式不够标准明确;例如这样的数据格式,就常常报错。
19:15.显示为:2011/1/1 19:152、%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与POSIXltPOSIXct 是以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. $sec04. [1] 53.2715105.06. $min07. [1] 3808.09. $hour10. [1] 2011.12. $mday13. [1] 614.15. $mon16. [1] 517.18. $year19. [1] 11620.21. $wday22. [1] 123.24. $yday25. [1] 15726.27. $isdst28. [1] 029.30. $zone31. [1] "CST"32.33. $gmtoff34. [1] 2880035.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. > today03. [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 days03. > as.POSIXct(today)‐as.POSIXct(as.Date("2012‐10‐25 01:00:00"))04. Time difference of 1320.529 days05. > 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 operator5、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 days03. > class(strptime("2006‐01‐08 10:07:52", "%Y‐%m‐%d"))04. [1] "POSIXlt" "POSIXt"2、excel另存为csv时发生的错误。