内容简介:R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。
R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。
R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。
要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。
关于作者:
- 张丹(Conan), 程序员/Quant: Java,R,Nodejs
- blog: http://blog.fens.me
- email: bsspirit@gmail.com
转载请注明出处:
http://blog.fens.me/r-hms/
前言
时间是数据的基本维度,是在做数据处理的时候,必须要掌握的技术。根据时间周期的不同,通常把时间分为,年、月、日、时、分、秒、毫秒等。对于年月日的数据是最常见的,也有很多的处理工具,时分秒的数据通常也会用处理日期的工具,这样有时候就不太方便。
hms包,很小很轻,专注于时、分、秒的时间数据处理。
目录
- hms包介绍
- hms包的使用
1. hms包介绍
hms包,用于存储和格式化时间,基于difftime类型,使用S3的面向对象数据结构。
本文的系统环境为:
- Win10 64bit
- R: 3.4.2 x86_64-w64-mingw32
安装hms包,非常简单,一条命令就可以了。
~ R > install.packages("hms") > 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包的设计思路一致。zoo包的详细介绍,请参考文章 R语言时间序列基础库zoo 。
hms包中,有大量的as.xxx()函数、format.hms()函数和print.hms()函数,是被用于S3类型函数继承调用的,是不需要我们在写程序的时候显示调用的。S3数据结构详细介绍,请参考文章 R语言基于S3的面向对象编程
2. hms包的使用
接下来,我们找几个重点函数进行介绍。
2.1 hms()函数
hms()函数,用于创建一个hms类型的对象。
函数定义:
hms(seconds = NULL, minutes = NULL, hours = NULL, days = NULL)
hms()函数,接收4个参数,分别对应秒,分,时,日。
创建hms对象
# 创建12:34:56的时间对象 > a1<-hms(56, 34, 12);a1 12:34:56 # 创建 10日12:34:56的时间对象 > a2<-hms(56, 34, 12,10);a2 252:34:56
打印结果的第一位252=10*24+12。
2.2 is.hms: 判断是否是hms类型
# 判断是否是hms类型 > is.hms(a1) [1] TRUE # 查看hms类型,父类是difftime类型 > class(a1) [1] "hms" "difftime" # 查看hms的属性 > attributes(a1) $units [1] "secs" $class [1] "hms" "difftime" # 查看hms对象的静态数据结构 > str(a1) Classes 'hms', 'difftime' atomic [1:1] 45296 ..- attr(*, "units")= chr "secs" # 查看面向对象类型 > library(pryr) > otype(a1) [1] "S3"
2.3 as.xxx.hms:把hms转型到其他类型
# 默认转型 > as.hms(a1) 12:34:56 # hms转型character,实际会隐式调用as.character.hms()函数 > as.character(a1) [1] "12:34:56" # hms转型POSIXct > as.POSIXct(a1) [1] "1970-01-01 12:34:56 UTC" # hms转型POSIXlt > as.POSIXlt(a1) [1] "1970-01-01 12:34:56 UTC"
由于我们没有定义as.Date.hms()函数,所以as.Date()函数,不能认识hms类型的转换。
# hms转型Date > as.Date(a1) Error in as.Date.default(a1) : 不知如何将'a1'转换成“Date”类别 Error during wrapup: cannot open the connection
自己定义一个as.Date.hms()函数,仅用于转型实验,没有实际业务意义。
# 函数定义 > as.Date.hms<-function(hms){ + s<-paste(Sys.Date(),' ',hms,sep="") + as.Date(s) + } # 显示调用函数 > as.Date.hms(a1) [1] "2018-12-14" # 隐式调用函数 > as.Date(a1) [1] "2018-12-14"
2.4 as.hms.xxx:把其他类型转型到hms
# 把字符串转hms > as.hms('19:13:14') 19:13:14 # 非法时间字符串转型 > as.hms('19:78:14') NA # 数字转型 > as.hms(111312) 30:55:12 # 时间转型 > as.hms(Sys.time()) 14:22:59.462795 # 日期转型,同样发生了错误 > as.hms(Sys.Date()) Error: Can't convert object of class Date to hms. Error during wrapup: cannot open the connection
2.5 parse_hms()/parse_hm()字符串解析
parse_hms对字符串进行转型,对比parse_hms()与as.hms()结果一样的。
# 执行parse_hms > parse_hms("12:34:56.789") 12:34:56.789 > as.hms("12:34:56.789") 12:34:56.789 # 执行parse_hm > parse_hm("12:34") 12:34:00 > as.hms("12:34") NA
打印parse_hms 函数名,查看源代码实现。
> parse_hms function (x) { as.hms(as.difftime(as.character(x), format = "%H:%M:%OS", units = "secs")) } >environment: namespace:hms<
parse_hms()函数,实际就是调用了as.hms()函数。
2.6 round_hms/trunc_hms
round_hms()函数,是把时间进行四舍五入对齐。
# 按秒,以5的倍数进行对齐,四舍五入 > round_hms(as.hms("12:34:51"), 5) 12:34:50 > round_hms(as.hms("12:34:54"), 5) 12:34:55 > round_hms(as.hms("12:34:56"), 5) 12:34:55 > round_hms(as.hms("12:34:59"), 5) 12:35:00 # 按秒,以60的倍数对齐 > round_hms(as.hms("12:34:56"), 60) 12:35:00
trunc_hms()函数,是把时间进行裁剪对齐。
# 按秒去掉末位,以5的倍数进行对齐 > trunc_hms(as.hms("12:34:01"), 5) 12:34:00 > trunc_hms(as.hms("12:34:44"), 5) 12:34:40 > trunc_hms(as.hms("12:34:56"), 60) 12:34:00
2.7 在data.frame中插入hms列
# 创建data.frame > df<-data.frame(hours = 1:3, hms = hms(hours = 1:3)) > df hours hms 1 1 01:00:00 2 2 02:00:00 3 3 03:00:00 # 查看df的静态结构 > str(df) 'data.frame': 3 obs. of 2 variables: $ hours: int 1 2 3 $ hms :Classes 'hms', 'difftime' atomic [1:3] 3600 7200 10800 .. ..- attr(*, "units")= chr "secs"
hms包很轻巧很简单,但却可以快速提高帮助我们处理时分秒数据,这些基础函数库是需要我们完全掌握和熟练运用的。
以上所述就是小编给大家介绍的《R语言轻巧的时间包hms》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- C语言中关于时间的函数
- 了解Python语言中的时间处理
- Go 语言中时间轮的实现
- 【译】时间序列建模完整教程(R语言)
- 兄弟连区块链技术培训分享Go语言之时间编程
- xk-time 2.2.0 发布,Java 时间工具包,支持解析自然语言时间,明天,下周,下月等。
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。