作者:张丹,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~ R2> 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的时间对象2> a1<-hms(56, 34, 12);a1312:34:5645# 创建 10日12:34:56的时间对象6> a2<-hms(56, 34, 12,10);a27252: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$units12[1] "secs"1314$class15[1] "hms"      "difftime"1617# 查看hms对象的静态数据结构18> str(a1)19Classes 'hms', 'difftime'  atomic [1:1] 4529620  ..- attr(*, "units")= chr "secs"2122# 查看面向对象类型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转型POSIXct10> as.POSIXct(a1)11[1] "1970-01-01 12:34:56 UTC"1213# hms转型POSIXlt14> as.POSIXlt(a1)15[1] "1970-01-01 12:34:56 UTC"

由于我们没有定义as.Date.hms()函数,所以as.Date()函数,不能认识hms类型的转换。

1# hms转型Date2> 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"1011# 隐式调用函数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:121112# 时间转型13> as.hms(Sys.time())1414:22:59.4627951516# 日期转型,同样发生了错误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:0010> 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:001011# 按秒,以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:004> trunc_hms(as.hms("12:34:44"), 5)512:34:406> 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 313 $ hms  :Classes 'hms', 'difftime'  atomic [1:3] 3600 7200 1080014  .. ..- attr(*, "units")= chr "secs"

hms包很轻巧很简单,但却可以快速提高帮助我们处理时分秒数据,这些基础函数库是需要我们完全掌握和熟练运用的。

往期精彩:

  • R语言实现46种距离算法

  • 用R语言实现密度聚类dbscan

  • R语言中文社区2018年终文章整理(作者篇)

  • R语言中文社区2018年终文章整理(类型篇)

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

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

给我【好看】

你也越好看!

R语言轻巧的时间包hms相关推荐

  1. R语言中的数据处理包dplyr、tidyr笔记

    R语言中的数据处理包dplyr.tidyr笔记 dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了与其 ...

  2. R语言 面板数据分析 plm包实现(一) ——LSDV和固定效应模型

    系列文章 R做面板数据分析:R语言 面板数据分析 plm包实现(一) --LSDV和固定效应模型 如果想看随机效应模型怎么做,参见这篇文章 R语言 面板数据分析 plm包实现(二)--随机效应模型 如 ...

  3. R语言数据科学程序包:Tidyverse介绍

    R语言数据科学程序包:Tidyverse介绍 1. R语言简介 2. 数据科学简介 3. Tidyverse简介 1. R语言简介 R语言是用于统计计算和绘图的免费软件.它可以在Windows, Un ...

  4. 视频|分类模型评估:精确率、召回率、ROC曲线、AUC与R语言生存分析时间依赖性ROC实现

    最近我们被客户要求撰写关于分类模型的研究报告,包括一些图形和统计输出. 本文将帮助您回答以下问题: ROC曲线是什么? 曲线下的面积是多少? 二元分类的决策阈值是多少? 分类模型可接受的 AUC值是多 ...

  5. R语言图形用户界面数据挖掘包Rattle:加载UCI糖尿病数据集、并启动Rattle图形用户界面、数据集变量重命名,为数据集结果变量添加标签、数据划分(训练集、测试集、验证集)、随机数设置

    R语言图形用户界面数据挖掘包Rattle:加载UCI糖尿病数据集.并启动Rattle图形用户界面.数据集变量重命名,为数据集结果变量添加标签.数据划分(训练集.测试集.验证集).随机数设置 目录

  6. R语言安装.tar.gz包

    R语言安装.tar.gz包 # 以ElemStatLearn包的安装为例 # "package 'ElemStatLearn' is not available for this versi ...

  7. R语言机器学习之caret包详解(一)

    R语言机器学习caret包trainControl函数详解 R语言机器学习之caret包详解(一) 简介 数据预处理 各种数据变换 近零方差变量 创建虚拟变量 重抽样技术 k折交叉验证 留一交叉验证 ...

  8. R语言在安装某个包时显示退出状态不是0

    R语言在安装某个包时显示退出状态不是0 在安装生存分析所用的包survminer时,install.packages("survminer") 试了多次,一直显示其退出状态为0 解 ...

  9. R语言图形用户界面数据挖掘包Rattle介绍、安装、启动、介绍(Using the rattle package for data mining)

    R语言图形用户界面数据挖掘包Rattle介绍.安装.启动.介绍(Using the rattle package for data mining) 目录

  10. R语言使用data.table包中的merge函数连接(内连接)两个dataframe数据(Inner join)

    R语言使用data.table包中的merge函数连接(内连接)两个dataframe数据(Inner join) 目录 R语言使用data.table包中的merge函数连接(内连接)两个dataf ...

最新文章

  1. 哪怕你不认可,我还是要为R语言正名
  2. Request、Request.Form和Request.QueryString的区别
  3. 机器翻译引擎的基本原理 ——LSTM
  4. CVPR 2018 | TVNet:可端到端学习视频的运动表征
  5. 记录 之 Argparse 中的 可选参数 action 用法
  6. Netty使用Marshalling传输信息
  7. 光遇服务器维护都在干什么,光遇:全图毕业后该做什么?老玩家建议,这四件事不做会后悔...
  8. net中的调试javascript脚本
  9. Wordpress不同页面显示不同小工具
  10. Windows Mobile 5 编程体验4
  11. 教你用1行Python代码制作动态二维码
  12. linux学习之lvm2逻辑卷管理
  13. 黑苹果alc269声卡仿冒id_ALC269声卡仿冒驱动的制作问题,请紫米、威廉等高手指导一下。...
  14. u盘如何在计算机应用内存,详解为什么8G内存U盘在电脑上显示不到8G只有7.5G
  15. Jmeter接口自动化(八)函数 上
  16. unity 获取多个坐标点的中心点
  17. 【转】一名大学生的PHP进阶之路
  18. 为何很多 App 图标使用白色做底色?
  19. ubuntu14.04 安装五笔输入法(fcitx)
  20. feature map

热门文章

  1. 使用Mybatis-Generator自动生成entity实体、dao接口以及mapper映射文件
  2. IntelliJ IDEA 查看类继承关系图,太强大了!
  3. 为什么说LinkedHashMap是Java中最大的数据结构? 了解一下?
  4. for (;;) 与 while (true),哪个更快?
  5. Facebook、亚马逊等巨头是如何建造自己的数据库的?
  6. 十年肺腑之言:说说技术总监的“三板斧”
  7. Linux.ProxyM僵尸网络再次发起疯狂攻击,感染过万台设备
  8. 【问题记录】mysql设置任意ip访问
  9. 如何在你的blog中添加炫酷的飘雪动画效果
  10. Laravel 使用firstOrCreate 报错MassAssignmentException