【數據分析】R|修正時區|as_datetime & timezone

【數據分析】R|時間格式處理|date format & lubridate上次提到如何將各種常見型態的日期以及時間,分別轉換成標準格式的Date和POSIXt型態,也見證了Lubridate的好用。

  在我的那篇文章中,有個待解決的問題,就是Lubridate用as_datetime轉完後的結果,雖然數字都乖乖的轉換成對的型態了,但!!出來的結果卻會將時區統一變成UTC,但我們實際上是住在CST阿!!所以需要額外做「時區轉換」。(這邊名詞如果有不了解可以回頭看上篇

時區轉換函數

在該篇文章裡,我有提到在Lubridate中有方法做時區轉換,有請with_tz()這個函式。
  • with_tz("datetime",tz="timezone")
這個函數就是專門針對剛剛所準備好的標準時間值(轉換完成後存放datetime型態的變數),將其時區根據你的需求做調整。舉例來說:
  • b<-as_datetime(1541111111)
  • with_tz(b, tz="時區")
就像這樣代進去。那後面的時區難道只是放CST(以身為台灣人為例)這麼簡單嗎?可以試試看,會報錯。那該怎麼做呢?

找尋所在時區

如何知道我們所在的時區?可以到環境裏頭去找,這裡透過Sys.getenv()可以看看環境(environment)中有那些現存資源,這時候發現到了TZDIR這個包含TimeZone資源的資料夾(Directory)。

Sys.getenv("TZDIR")
來講講我是怎麼發現這個位置的?輸入完Sys.getenv之後,按Tab會自動補全並跳到()中央,再按一次Tab就能知道這個函數能呼叫什麼,而我要找的跟Timezone有關,所以就先輸入tz,這時候跳提示出現TZDIR,再次Tab補全。

  跑了這行程式碼後,會告訴你這個資料夾所在地方:R>R-3.5.1>share>zoneinfo,進入資料夾後,發現存在各種地區(如下圖)
[存有各地timezone的zoneinfo資料夾]

這時候需要發揮本能了,生而為人,應該都清楚知道自己住哪,站在地球上的哪個位置。像我所在的地方位於台灣的新北市。雖然沒有新北市,但可以看到Asia中有Taipei,這就是我們的標的。(如果是在國外的話,就可以找找自己所在位置在哪。)

設定時區

從剛剛那個步驟,得到tz後方可填的確切時區Taipei,在Asia資料夾內,以檔案階層的方式呼叫。

with_tz(b,tz="Asia/Taipei")
  • b <- with_tz(b, tz = "Asia/Taipei")
  • "2018-11-01 22:25:11 UTC""2018-11-02 06:25:11 CST"
如此一來就成功得到轉換後的正確時區了!

然而,有時候我們可能得到的數字是正確的,錯的只有timezone,這時候如果再用這種方式轉換,會讓數字也跟著變。這種情況就變成需要force_tz()的作法:
  • force_tz(b, tz = "Asia/Taipei")

補充

  • ori_data <- 1541111111
  • timestamp <- ori_data %>% as_datetime() %>% with_tz("Asia/Taipei")
通常我們得到的會是一整欄充滿大數字的vector,剛剛的寫法也可以改成加入magrittr符號來閱讀,且能減少增加過渡期的變數。

下一篇我會再進一步介紹%>%及其應用情境,還有一些方便撰寫R的快捷(鍵)功能。

留言

【熱門】# HOT

【數據分析】R|時間格式處理|date format & lubridate

【軟體操作】Google Slides|下載共用簡報方式與網址

【數據分析】R|擷取字串|RegEx與常用函數