R語言輕巧的時間包hms
R的極客理想系列文章,涵蓋了R的思想,使用,工具,創新等的一系列要點,以我個人的學習和體驗去詮釋R的強大。
R語言作為統計學一門語言,一直在小眾領域閃耀著光芒。直到大資料的爆發,R語言變成了一門炙手可熱的資料分析的利器。隨著越來越多的工程背景的人的加入,R語言的社群在迅速擴大成長。現在已不僅僅是統計領域,教育,銀行,電商,網際網路….都在使用R語言。
要成為有理想的極客,我們不能停留在語法上,要掌握牢固的數學,概率,統計知識,同時還要有創新精神,把R語言發揮到各個領域。讓我們一起動起來吧,開始R的極客理想。
關於作者:
- 張丹(Conan), 程式員/Quant: Java,R,Nodejs
- blog: http://blog.fens.me
- email: [email protected]
轉載請註明出處:
ofollow,noindex">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 hourshms 11 01:00:00 22 02:00:00 33 03:00:00 # 檢視df的靜態結構 > str(df) 'data.frame':3 obs. of2 variables: $ hours: int1 2 3 $ hms:Classes 'hms', 'difftime'atomic [1:3] 3600 7200 10800 .. ..- attr(*, "units")= chr "secs"
hms包很輕巧很簡單,但卻可以快速提高幫助我們處理時分秒資料,這些基礎函式庫是需要我們完全掌握和熟練運用的。