在处理一些数据中,我经常遇到一些日期数据,今天就来说说对于不同格式的日期数据该怎么处理。下面是一些常用来处理的函数。
as.Date(x, ...)## S3 method for class 'character'
as.Date(x, format, ...)## S3 method for class 'numeric'
as.Date(x, origin, ...)## S3 method for class 'POSIXct'
as.Date(x, tz = "UTC", ...)
as.POSIXct(x, tz = "", ...)
as.POSIXlt(x, tz = "", ...)## S3 method for class 'character'
as.POSIXlt(x, tz = "", format, ...)## S3 method for class 'numeric'
as.POSIXlt(x, tz = "", origin, ...)
strftime(x, format = "", tz = "", usetz = FALSE, ...)
strptime(x, format, tz = "")
处理时间数据一般会用到as.Date,as.POSIXct,strptime函数,x就是日期数据,另外比较重要的参数就是format,origin,tz。format指日期格式;origin指时间起点,比如处理Unix时间戳,下面会有介绍;tz指时区,我们位于东八区,使用的是北京时间,简称CST。
format参数详解
format参数可以说是最重要的参数,它看起来比较简单,类似%y%m%d的样子,它用来指定日期格式,但除了y,m,d之前还有许多参数,下面我简单介绍一下。
(左右可以滑动)
参数 | 含义 |
---|---|
%a | 当天为星期几,简称 |
%A | 当天为星期几,全称 |
%b | 月份为英文简称 |
%B | 月份为英文全称。其实和%b用起来有时候没差别 |
%c | 以“星期 月 日 时:分:秒 年"的格式输出 |
%C | 输出年份的前两位,比如2018输出20。 |
%d | 输出日,01-31。比如2018-03-02输出02 |
%D | 以月/天/年的格式输出 |
%e | 输出日,1-31。比如2018-03-02输出2 |
%F | 等价于 %Y-%m-%d,输出日期 |
%g | 输出年的后两位,比如2006-01-08输出06 |
%G | 输出年份,比如2006-01-08输出2006 |
%h | 等价于%b |
%H | 小时,00-23 |
%I | 小时,01-12 |
%j | 一年的天数,001-366 |
%m | 月数,01-12 |
%M | 分钟数,00-59 |
%p | 只输出AM/PM,判断上午还是下午 |
%r | 以12小时制输出时间,并且输出AM/PM |
%R | 等价于%H:%M |
%S | 输出秒 |
%T | 输出等价于%H:%M:%S。 |
%u | 判断星期几,1-7,1代表星期一,也可以代表一周中的第几天 |
%U | 判断是今年第几周,00-53。星期天作为一周的第一天 |
%w | 星期几,取值为0-6,0代表星期日· |
%W | 判断是今年第几周,00-53。星期一作为一周的第一天 |
%x | 以 月/日/年格式输出时间 |
%X | 以 时/分/秒的格式输出时间 |
%y | 表示年份的后两位,0-68前两位用19补充,69-99前两位用20补充,比如02/27/92表示1992年 |
%Y | 表示年,取值0-9999 |
%z | 与UTC时间偏移 |
%Z | 输出时区简称 |
现在来举几个例子来看看。
> as.Date("01-Jan-1995","%d-%B-%Y")
[1] "1995-01-01"
> as.Date("01-Jan-1995","%d-%b-%Y")
[1] "1995-01-01"
> strftime("2006-01-08 15:07:52","%H") #以24小时制提取小时
[1] "15"
> strftime("2006-01-08 15:07:52","%I") #以12小时制提取小时
[1] "03"
> strftime("2018/02/28","%x") #时/分/秒的格式输出时间
[1] "02/28/18"
> strptime("02/27/92","%m/%d/%y")
[1] "1992-02-27 CST"
> strftime("2018-2-26","%A") #输出星期几
[1] "Monday"
下面附上12个月的英文单词和简写,顺便温习一下12个月的单词怎么写,哈哈!
月份 | 英文 | 简称 | 月份 | 英文 | 简称 |
---|---|---|---|---|---|
一月 | January | Jan | 七月 | July | Jul |
二月 | February | Feb | 八月 | August | Aug |
三月 | March | Mar | 九月 | September | Sep |
四月 | April | Apr | 十月 | October | Oct |
五月 | May | May | 十一月 | November | Nov |
六月 | June | Jun | 十二月 | December | Dec |
origin参数详解
我们来建举一个简单的例子,有些日期数据是以Unix时间戳的形式来记录的。时间戳是自1970年1月1日(00:00:00 GMT)以来的秒数。它也被称为Unix时间或Unix时间戳。在处理时间戳数据可以使用as.POSIXct()
函数。网上也有许多网站可以转。而as.POSIXlt是用列表来表示时间,时间的每一部分都是列表的一个元素。废话不多说,直接来看例子。
#878887116就是一个Unix时间戳
> as.POSIXct(878887116,origin="1970-01-01") # 处理时间戳 CST表示北京时间。
[1] "1997-11-07 15:18:36 CST"
> tc1<-as.POSIXct("2018-2-28")##求时间差,不满足加法
> tc2<-as.POSIXct("2018-2-26")
> tc1-tc2
Time difference of 2 days
> al<-as.POSIXlt("2018-2-26") ##as.POSIXlt以列表来表示时间
> unlist(al)
sec min hour mday mon year wday yday isdst zone gmtoff
"0" "0" "0" "26" "1" "118" "1" "56" "0" "CST" NA
> unclass(al)##也可以用unclass查看
$sec
[1] 0
$min
[1] 0
$hour
[1] 0
$mday
[1] 26
$mon
[1] 1
$year
[1] 118
$wday
[1] 1
$yday
[1] 56
$isdst
[1] 0
$zone
[1] "CST"
$gmtoff
[1] NA
由于那个时区简称太多,我这就不列举了,想了解的可以在www.timeanddate.com/time/zones/查看。
说到最后,如果你在做时间转换一直结果都是NA的话,试试输入Sys.setlocale("LC_TIME","C")
再转化看看结果如何。
后来在网上查阅之后,发现有专门用来做时间处理的包—lubridata和timeDate,我想用它的话对时间数据处理就会更方便,如果用这些函数处理麻烦的话再看看那两个包。
转载请注明:
作者:王亨
公众号:跟着菜鸟一起学R语言
原文链接:http://blog.csdn.net/wzgl__wh