• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

R语言轻巧的时间包hms

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

作者:张丹,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语言发布时间:2022-07-18
下一篇:
R语言的一些笔记发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap