2016-07-07 137 views
3

我試圖對POSIXct向量做一些操作,但是當我將它傳遞給函數時,向量更改爲numeric向量,而不是保留POSIXct類,即使在函數本身只返回對象:通過POSIXct對象函數返回數字向量

# Sample dates from vector and it's class. 
> dates <- as.POSIXct(c("2012-02-01 12:32:00", "2012-10-24 17:25:56", "2008-09-26 17:13:31", "2011-08-23 11:11:17,", "2015-09-19 22:28:33"), tz = "America/Los_Angeles") 
> dates 
[1] "2012-02-01 12:32:00 PST" "2012-10-24 17:25:56 PDT" "2008-09-26 17:13:31 PDT" "2011-08-23 11:11:17 PDT" "2015-09-19 22:28:33 PDT" 
> class(dates) 
[1] "POSIXct" "POSIXt" 
# Simple subset is retaining original class. 
> qq <- dates[1:5] 
> qq 
[1] "2012-02-01 12:32:00 PST" "2012-10-24 17:25:56 PDT" "2008-09-26 17:13:31 PDT" "2011-08-23 11:11:17 PDT" "2015-09-19 22:28:33 PDT" 
> class(qq) 
[1] "POSIXct" "POSIXt" 
# sapply on the same subset using simple "return" function changes class to "numeric" - why? How to retain "POSIXct"? 
> qq2 <- sapply(dates[1:5], function(x) x) 
> qq2 
[1] 1328128320 1351124756 1222474411 1314123077 1442726913 
> class(qq2) 
[1] "numeric" 

爲什麼會發生?我怎樣才能保留原始矢量的POSIXct類?我知道POSIXctnumeric在引擎蓋下,但我想保留原始類的可讀性。

回答

2

我們可以使用lapply而不是sapply作爲sapply默認情況下有simplify = TRUE選項。因此,如果list元素的長度相同,則將其簡化爲vectormatrix,具體取決於list元素的長度,POSIXct存儲爲numeric

lst <- lapply(dates, function(x) x) 

如果我們需要使用sapply,那麼選擇將simplify = FALSE

lst <- sapply(dates, function(x) x, simplify=FALSE) 

應用功能,如果我們需要作爲載體輸出,

do.call("c", lst) 

關於變更後時區,它記錄在?DateTimeClasses

在「POSIXlt」對象上使用c會將它們轉換爲當前時區 ,並且「POSIXct」對象會丟棄任何「tzone」屬性(即使它們全部標有相同時區)。

因此,可能的選擇是

.POSIXct(lst, tz = "America/Los_Angeles") 
#[1] "2012-02-01 12:32:00 PST" "2012-10-24 17:25:56 PDT" "2008-09-26 17:13:31 PDT" "2011-08-23 11:11:17 PDT" "2015-09-19 22:28:33 PDT" 

或在評論中提到@thelatemail

.POSIXct(sapply(dates,I), attr(dates,"tzone")) 
+0

@kmo我認爲你可能(如在由@kmo評論中提到)必須用'tz'指定時區 – akrun

+0

感謝您的回答!我注意到一件事 - 轉換爲向量後,時區變爲本地:'> do.call(「c」,lapply(日期[1:5],函數(x)x)) [1]「 2012-02-01 21:32:00 CET「」2012-10-25 02:25:56 CEST「」2008-09-27 02:13:31 CEST「」2011-08-23 20:11:17 CEST 「」2015-09-20 07:28:33 CEST「'。對此有任何想法? – kmo

+0

@kmo在我的系統中,您的原始日期具有「PST」和「PDT」作爲時區。 – akrun