分享

日期格式那么多,处理起来却贼简单

 萌小芊 2018-03-01

在处理一些数据中,我经常遇到一些日期数据,今天就来说说对于不同格式的日期数据该怎么处理下面是一些常用来处理的函数。

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。

  1. 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个月的单词怎么写,哈哈!

月份英文简称月份英文简称
一月JanuaryJan七月JulyJul
二月FebruaryFeb八月AugustAug
三月MarchMar九月SeptemberSep
四月AprilApr十月OctoberOct
五月MayMay十一月NovemberNov
六月JuneJun十二月DecemberDec
  1. 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-tc2Time 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,我想用它的话对时间数据处理就会更方便,如果用这些函数处理麻烦的话再看看那两个包。

如果你有什么关于时间处理的好方法或有什么问题也欢迎在留言区分享交流。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多