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包很轻巧很简单,但却可以快速提高帮助我们处理时分秒数据,这些基础函数库是需要我们完全掌握和熟练运用的。
转载请注明出处:
http://blog.fens.me/r-hms/