R语言轻巧的时间包hms

浏览: 352

作者:张丹,R语言中文社区专栏特邀作者,《R的极客理想》系列图书作者,民生银行大数据中心数据分析师,前况客创始人兼CTO。
个人博客 http://fens.me, Alexa全球排名70k。

前言

时间是数据的基本维度,是在做数据处理的时候,必须要掌握的技术。根据时间周期的不同,通常把时间分为,年、月、日、时、分、秒、毫秒等。对于年月日的数据是最常见的,也有很多的处理工具,时分秒的数据通常也会用处理日期的工具,这样有时候就不太方便。

hms包,很小很轻,专注于时、分、秒的时间数据处理。

目录

  1. hms包介绍

  2. hms包的使用

1.hms包介绍

hms包,用于存储和格式化时间,基于difftime类型,使用S3的面向对象数据结构。

本文的系统环境为:

  • Win10 64bit

  • R: 3.4.2 x86_64-w64-mingw32

安装hms包,非常简单,一条命令就可以了。

1~ R
2> install.packages("hms")
3> library(hms)

函数列表:

  • hms: 创建一个hms类型对象

  • is.hms: 判断是否是hms类型

  • parse_hm: 解析hm值

  • parse_hms: 解析hms值

  • round_hms:四舍五入对齐

  • trunc_hms:裁剪对齐

  • as.hms: hms泛型函数,S3类型,用于隐式调用它的继承函数

  • as.hms.character: character转型hms,用于as.hms的继承调用

  • as.hms.default: hms转型hms,用于as.hms的继承调用

  • as.hms.difftime:difftime转型hms,用于as.hms的继承调用

  • as.hms.numeric: numeric转型hms,用于as.hms的继承调用

  • as.hms.POSIXlt: POSIXlt转型hms,用于as.hms的继承调用

  • as.hms.POSIXt: POSIXt转型hms,用于as.hms的继承调用

  • as.character.hms: hms转型character,用于as.character的继承调用

  • as.data.frame.hms: hms转型data.frame,用于as.data.frame的继承调用

  • as.POSIXct.hms: hms转型POSIXct,用于as.POSIXct的继承调用

  • as.POSIXlt.hms: hms转型POSIXlt,用于as.POSIXlt的继承调用

  • format.hms: 格式化hms,用于format的继承调用

  • print.hms: 打印hms对像,用于print的继承调用

从函数列表可以看到,hms包的功能很单一,就在做数据类型和数据变型,是底层的数据结构包,设计思路与zoo包的设计思路一致。

hms包中,有大量的as.xxx()函数、format.hms()函数和print.hms()函数,是被用于S3类型函数继承调用的,是不需要我们在写程序的时候显示调用的。

2.hms包的使用

接下来,我们找几个重点函数进行介绍。

2.1

hms()函数

hms()函数,用于创建一个hms类型的对象。
函数定义:

1hms(seconds = NULL, minutes = NULL, hours = NULL, days = NULL)

hms()函数,接收4个参数,分别对应秒,分,时,日。

创建hms对象

1# 创建12:34:56的时间对象
2a1<-hms(56, 34, 12);a1
312:34:56
4
5# 创建 10日12:34:56的时间对象
6a2<-hms(56, 34, 12,10);a2
7252:34:56

打印结果的第一位252=10*24+12。


2.2

is.hms:判断是否是hms类型

 1# 判断是否是hms类型
2is.hms(a1)
3[1] TRUE
4
5# 查看hms类型,父类是difftime类型
6class(a1)
7[1"hms"      "difftime"
8
9# 查看hms的属性
10> attributes(a1)
11$units
12[1"secs"
13
14$class
15[1"hms"      "difftime"
16
17# 查看hms对象的静态数据结构
18> str(a1)
19Classes 'hms''difftime'  atomic [1:145296
20  ..- attr(*, "units")= chr "secs"
21
22# 查看面向对象类型
23> library(pryr)
24> otype(a1)
25[1"S3"

2.3

as.xxx.hms:把hms转型到其他类型

 1# 默认转型
2as.hms(a1)
312:34:56
4
5hms转型character,实际会隐式调用as.character.hms()函数
6as.character(a1)
7[1] "12:34:56"
8
9hms转型POSIXct
10as.POSIXct(a1)
11[1] "1970-01-01 12:34:56 UTC"
12
13hms转型POSIXlt
14as.POSIXlt(a1)
15[1] "1970-01-01 12:34:56 UTC"


由于我们没有定义as.Date.hms()函数,所以as.Date()函数,不能认识hms类型的转换。

1# hms转型Date
2as.Date(a1)
3Error in as.Date.default(a1) : 不知如何将'a1'转换成“Date”类别
4Error during wrapup: cannot open the connection


自己定义一个as.Date.hms()函数,仅用于转型实验,没有实际业务意义。

 1# 函数定义
2as.Date.hms<-function(hms){
3+   s<-paste(Sys.Date(),' ',hms,sep="")
4+   as.Date(s)
5+ }
6
7# 显示调用函数
8as.Date.hms(a1)
9[1"2018-12-14"
10
11# 隐式调用函数
12as.Date(a1)
13[1"2018-12-14"

2.4

as.hms.xxx:把其他类型转型到hms

 1# 把字符串转hms
2as.hms('19:13:14')
319:13:14
4# 非法时间字符串转型
5as.hms('19:78:14')
6NA
7
8# 数字转型
9as.hms(111312)
1030:55:12
11
12# 时间转型
13as.hms(Sys.time())
1414:22:59.462795
15
16# 日期转型,同样发生了错误
17as.hms(Sys.Date())
18Error: Can't convert object of class Date to hms.
19Error during wrapup: cannot open the connection

2.5

parse_hms()/parse_hm()字符串解析

parse_hms对字符串进行转型,对比parse_hms()与as.hms()结果一样的。

 1# 执行parse_hms
2parse_hms("12:34:56.789")
312:34:56.789
4as.hms("12:34:56.789")
512:34:56.789
6
7# 执行parse_hm
8parse_hm("12:34")
912:34:00
10as.hms("12:34")
11NA


打印parse_hms 函数名,查看源代码实现。

1> parse_hms 
2function (x) {
3as.hms(as.difftime(as.character(x), format = "%H:%M:%OS",
4units = "secs"))
5}
6>environment: namespace:hms<

parse_hms()函数,实际就是调用了as.hms()函数。


2.6

round_hms/trunc_hms

round_hms()函数,是把时间进行四舍五入对齐。

 1# 按秒,以5的倍数进行对齐,四舍五入
2round_hms(as.hms("12:34:51"), 5)
312:34:50
4round_hms(as.hms("12:34:54"), 5)
512:34:55
6round_hms(as.hms("12:34:56"), 5)
712:34:55
8round_hms(as.hms("12:34:59"), 5)
912:35:00
10
11# 按秒,以60的倍数对齐
12round_hms(as.hms("12:34:56"), 60)
1312:35:00


trunc_hms()函数,是把时间进行裁剪对齐。

1# 按秒去掉末位,以5的倍数进行对齐
2trunc_hms(as.hms("12:34:01"), 5)
312:34:00
4trunc_hms(as.hms("12:34:44"), 5)
512:34:40
6trunc_hms(as.hms("12:34:56"), 60)
712:34:00


2.7

在data.frame中插入hms列

 1# 创建data.frame
2> df<-data.frame(hours = 1:3, hms = hms(hours = 1:3))
3> df
4  hours      hms
51     1 01:00:00
62     2 02:00:00
73     3 03:00:00
8
9# 查看df的静态结构
10> str(df)
11'data.frame':    3 obs. of  2 variables:
12 $ hours: int  1 2 3
13 $ hms  :Classes 'hms''difftime'  atomic [1:33600 7200 10800
14  .. ..- attr(*, "units")= chr "secs"

hms包很轻巧很简单,但却可以快速提高帮助我们处理时分秒数据,这些基础函数库是需要我们完全掌握和熟练运用的。


往期精彩:


公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战
回复 Python       1小时破冰入门
回复 数据挖掘     R语言入门及数据挖掘
回复 人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习     机器学习的商业应用
回复 数据科学     数据科学实战
回复 常用算法     常用数据挖掘算法

推荐 0
本文由 R语言中文社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册