作者:张丹,R语言中文社区专栏特邀作者,《R的极客理想》系列图书作者,民生银行大数据中心数据分析师,前况客创始人兼CTO。
个人博客 http://fens.me, Alexa全球排名70k。
前言
时间是数据的基本维度,是在做数据处理的时候,必须要掌握的技术。根据时间周期的不同,通常把时间分为,年、月、日、时、分、秒、毫秒等。对于年月日的数据是最常见的,也有很多的处理工具,时分秒的数据通常也会用处理日期的工具,这样有时候就不太方便。
hms包,很小很轻,专注于时、分、秒的时间数据处理。
目录
hms包介绍
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.1
hms()函数
hms()函数,用于创建一个hms类型的对象。
函数定义:
1hms(seconds = NULL, minutes = NULL, hours = NULL, days = NULL)
hms()函数,接收4个参数,分别对应秒,分,时,日。
创建hms对象
1# 创建12:34:56的时间对象
2> a1<-hms(56, 34, 12);a1
312:34:56
4
5# 创建 10日12:34:56的时间对象
6> a2<-hms(56, 34, 12,10);a2
7252:34:56
打印结果的第一位252=10*24+12。
2.2
is.hms:判断是否是hms类型
1# 判断是否是hms类型
2> is.hms(a1)
3[1] TRUE
4
5# 查看hms类型,父类是difftime类型
6> class(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:1] 45296
20 ..- attr(*, "units")= chr "secs"
21
22# 查看面向对象类型
23> library(pryr)
24> otype(a1)
25[1] "S3"
2.3
as.xxx.hms:把hms转型到其他类型
1# 默认转型
2> as.hms(a1)
312:34:56
4
5# hms转型character,实际会隐式调用as.character.hms()函数
6> as.character(a1)
7[1] "12:34:56"
8
9# hms转型POSIXct
10> as.POSIXct(a1)
11[1] "1970-01-01 12:34:56 UTC"
12
13# hms转型POSIXlt
14> as.POSIXlt(a1)
15[1] "1970-01-01 12:34:56 UTC"
由于我们没有定义as.Date.hms()函数,所以as.Date()函数,不能认识hms类型的转换。
1# hms转型Date
2> as.Date(a1)
3Error in as.Date.default(a1) : 不知如何将'a1'转换成“Date”类别
4Error during wrapup: cannot open the connection
自己定义一个as.Date.hms()函数,仅用于转型实验,没有实际业务意义。
1# 函数定义
2> as.Date.hms<-function(hms){
3+ s<-paste(Sys.Date(),' ',hms,sep="")
4+ as.Date(s)
5+ }
6
7# 显示调用函数
8> as.Date.hms(a1)
9[1] "2018-12-14"
10
11# 隐式调用函数
12> as.Date(a1)
13[1] "2018-12-14"
2.4
as.hms.xxx:把其他类型转型到hms
1# 把字符串转hms
2> as.hms('19:13:14')
319:13:14
4# 非法时间字符串转型
5> as.hms('19:78:14')
6NA
7
8# 数字转型
9> as.hms(111312)
1030:55:12
11
12# 时间转型
13> as.hms(Sys.time())
1414:22:59.462795
15
16# 日期转型,同样发生了错误
17> as.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
2> parse_hms("12:34:56.789")
312:34:56.789
4> as.hms("12:34:56.789")
512:34:56.789
6
7# 执行parse_hm
8> parse_hm("12:34")
912:34:00
10> as.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的倍数进行对齐,四舍五入
2> round_hms(as.hms("12:34:51"), 5)
312:34:50
4> round_hms(as.hms("12:34:54"), 5)
512:34:55
6> round_hms(as.hms("12:34:56"), 5)
712:34:55
8> round_hms(as.hms("12:34:59"), 5)
912:35:00
10
11# 按秒,以60的倍数对齐
12> round_hms(as.hms("12:34:56"), 60)
1312:35:00
trunc_hms()函数,是把时间进行裁剪对齐。
1# 按秒去掉末位,以5的倍数进行对齐
2> trunc_hms(as.hms("12:34:01"), 5)
312:34:00
4> trunc_hms(as.hms("12:34:44"), 5)
512:34:40
6> trunc_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:3] 3600 7200 10800
14 .. ..- attr(*, "units")= chr "secs"
总
结
hms包很轻巧很简单,但却可以快速提高帮助我们处理时分秒数据,这些基础函数库是需要我们完全掌握和熟练运用的。
往期精彩:
公众号后台回复关键字即可学习
回复 爬虫 爬虫三大案例实战
回复 Python 1小时破冰入门
回复 数据挖掘 R语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
回复 常用算法 常用数据挖掘算法
给我【好看】
你也越好看!