R語言輕巧的時間包hms

R語言輕巧的時間包hms

歡迎關注天善智能,我們是專注於商業智能BI,人工智能AI,大數據分析與挖掘領域的垂直社區,學習,問答、求職一站式搞定!

對商業智能BI、大數據分析挖掘、機器學習,python,R等數據領域感興趣的同學加微信:tstoutiao,邀請你進入數據愛好者交流群,數據愛好者們都在這兒。

作者:張丹,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的時間對象
2> a1312:34:56
4
5# 創建 10日12:34:56的時間對象
6> 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$units
12[1] "secs"
13
14$class
15[1] "hms" "difftime"
16
17# 查看hms對象的靜態數據結構
18> str(a1)
19Classes 'hms', 'difftime' atomic [1:1] 45296
20 ..- attr(*, "units")= chr "secs"
21
22# 查看面向對象類型
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轉型POSIXct
10> as.POSIXct(a1)
11[1] "1970-01-01 12:34:56 UTC"
12
13# hms轉型POSIXlt
14> as.POSIXlt(a1)
15[1] "1970-01-01 12:34:56 UTC"

由於我們沒有定義as.Date.hms()函數,所以as.Date()函數,不能認識hms類型的轉換。

1# hms轉型Date
2> 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 3+ s 4+ as.Date(s)
5+ }
6
7# 顯示調用函數
8> as.Date.hms(a1)
9[1] "2018-12-14"
10
11# 隱式調用函數
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:12
11
12# 時間轉型
13> as.hms(Sys.time())
1414:22:59.462795
15
16# 日期轉型,同樣發生了錯誤
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:00
10> 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:00
10
11# 按秒,以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:00
4> trunc_hms(as.hms("12:34:44"), 5)
512:34:40
6> trunc_hms(as.hms("12:34:56"), 60)

712:34:00

2.7

在data.frame中插入hms列

 1# 創建data.frame
2> df 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:3] 3600 7200 10800
14 .. ..- attr(*, "units")= chr "secs"

hms包很輕巧很簡單,但卻可以快速提高幫助我們處理時分秒數據,這些基礎函數庫是需要我們完全掌握和熟練運用的。

R語言輕巧的時間包hms

往期精彩:

  • R語言實現46種距離算法
  • 用R語言實現密度聚類dbscan
  • R語言中文社區2018年終文章整理(作者篇)
  • R語言中文社區2018年終文章整理(類型篇)
R語言輕巧的時間包hms

回覆 爬蟲 爬蟲三大案例實戰

回覆 Python 1小時破冰入門

回覆 數據挖掘 R語言入門及數據挖掘

回覆 人工智能 三個月入門人工智能

回覆 數據分析師 數據分析師成長之路

回覆 機器學習 機器學習的商業應用

回覆 數據科學 數據科學實戰

回覆 常用算法 常用數據挖掘算法


分享到:


相關文章: