問題描述:
在本地使用as.Date()函數從POSIXct類型中提取date時,出現了日期不一致的錯誤。導致處理數據時,總是出問題。
還好被領導發現數據有誤,不然這個bug不知道還要潛伏多久。盡管如此,找出這個問題還是花了我很長時間。
原因:
這里的問題在於,當我們用as.POSIXct將形如 "2016-04-15 00:00:37" 的字符轉換為POSIXct類型時,默認使用的是本地系統的時區。
如中國的時區是CST,則得到的POSIXct為:"2016-04-15 00:00:37 CST".
但是使用as.Date(POSIXct)提取date時,as.Date()函數默認使用的標准時間是UTC。所以這里就出現了8小時的誤差,導致提取出來的日期不一致。
as.Date()函數文檔的相關說明: The as.Date methods accept character strings, factors, logical NA and objects of classes "POSIXlt" and "POSIXct". (The last is converted to days by ignoring the time after midnight in the representation of the time in specified time zone, default UTC.) (括號里大意是說,用as.Date函數轉換POSIXct格式的數據時,默認將POSIXct轉為UTC時區后,再取days) as.POSIXct()函數文檔的相關說明: System-specific (see time zones), but "" is the current time zone, and "GMT" is UTC (Universal Time, Coordinated). (大意是說,as.POSIXct()時若沒有指定tz字段,則函數會使用操作系統所在的時區,""表示當前時區。)
解決方法:
比較合理的方法應該是:根據需要使用tz字段直接指定所用的時區。保證兩者時區統一。
不過只是想提取date的話,使用as.Date(format(POSIXct_string, '%Y%m%d'))應該也是可以的
關於時區的概念可參考百度百科:http://baike.baidu.com/view/42936.htm