R语言轻巧的时间包hms

640?wx_fmt=png

作者:张丹,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包很轻巧很简单,但却可以快速提高帮助我们处理时分秒数据,这些基础函数库是需要我们完全掌握和熟练运用的。



640?wx_fmt=gif


往期精彩:


640?wx_fmt=jpeg

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

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

给我【好看】

你也越好看!

640?wx_fmt=png
lubridateR语言中用于处理日期和时间数据的工具。它提供了一组简单而灵活的函数,可以解析、操作和计算日期和时间对象。lubridate主要分为两类函数:处理时点数据(time instants)和处理时段数据(time spans)。对于时点数据,lubridate提供了函数来解析各种日期和时间格式的数据,并提供了函数来提取日期和时间的各个组成部分,如年、月、日、小时、分钟和秒。对于时段数据,lubridate提供了函数来计算和操作日期和时间之间的差异,如计算两个日期之间的天数、小时数和分钟数等。 以下是使用lubridate处理日期和时间数据的一些常见操作: 1. 解析日期和时间数据: 使用`ymd()`函数解析年-月-日格式的日期数据。 使用`ymd_hms()`函数解析年-月-日 时:分:秒格式的日期时间数据。 2. 提取日期和时间的组成部分: 使用`year()`函数获取日期或时间的年份。 使用`month()`函数获取日期或时间的月份。 使用`day()`函数获取日期或时间的日。 使用`hour()`函数获取日期或时间的小时。 使用`minute()`函数获取日期或时间的分钟。 使用`second()`函数获取日期或时间的秒。 3. 计算日期和时间之间的差异: 使用`interval()`函数创建时间间隔对象。 使用`%--%`运算符计算两个日期或时间之间的差异。 4. 格式化日期和时间数据: 使用`format()`函数将日期和时间对象格式化为指定的字符串格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值