2015-11-21 46 views
3

我有一個數據幀像這樣:with_tz與時區的矢量

library(dplyr) 
data <- data_frame(
    timestamp_utc = c('2015-11-18 03:55:04', '2015-11-18 03:55:08', 
        '2015-11-18 03:55:10'), 
    local_tz = c('America/New_York', 'America/Los_Angeles', 
       'America/Indiana/Indianapolis') 
) 

我需要創建轉換爲在local_tz列定義的UTC時間戳爲本地時間一個新的變量。然而,formatwith_tz(來自lubridate)都只期望一個時區,而不是時區的向量。我正在尋找這樣的事情:

mutate(data, timestamp_local = with_tz(timestamp_utc, tzone = local_tz)) 

任何想法?

回答

3

這是一種方法。這樣,結果必須是一個字符串,否則unlist()c()會將結果返回到列表中每個元素的系統時區。

它仍然很慢,因爲它沒有矢量化。

> get_local_time <- function(timestamp_utc, local_tz) { 
    l <- lapply(seq(length(timestamp_utc)), 
       function(x) {format(with_tz(timestamp_utc[x], local_tz[x]), "%FT%T%z")}) 
    unlist(l) 
    } 

> mutate(data, timestamp_local = get_local_time(timestamp_utc, tzone = local_tz)) 

Source: local data frame [3 x 3] 

     timestamp_utc      local_tz   timestamp_local 
       (time)      (chr)     (chr) 
1 2015-11-18 03:55:04    America/New_York 2015-11-17T22:55:04-0500 
2 2015-11-18 03:55:08   America/Los_Angeles 2015-11-17T19:55:08-0800 
3 2015-11-18 03:55:10 America/Indiana/Indianapolis 2015-11-17T22:55:10-0500 

更新2015年11月24日

使用dplyr::combine()而非unlist()允許變量與正確的時區的屬性,而不是轉換爲字符串留日期時間。

> get_local_time <- function(timestamp_utc, local_tz) { 
    l <- lapply(seq(length(timestamp_utc)), 
       function(x) {with_tz(timestamp_utc[x], local_tz[x])}) 
    combine(l) 
    } 

> mutate(data, timestamp_local = get_local_time(timestamp_utc, tzone = local_tz)) 

Source: local data frame [3 x 3] 

     timestamp_utc      local_tz  timestamp_local 
       (time)      (chr)    (time) 
1 2015-11-18 03:55:04    America/New_York 2015-11-17T22:55:04 
2 2015-11-18 03:55:08   America/Los_Angeles 2015-11-17T19:55:08 
3 2015-11-18 03:55:10 America/Indiana/Indianapolis 2015-11-17T22:55:10 
+0

我不能用上面指定的數據成功地運行這個例子:'錯誤:'reclass_date'沒有應用於類「字符」類的對象的適用方法' – MartinT

3

首先確保你的數據加載爲一個日期 - 我不得不轉換爲日期第一:

data$timestamp_utc <- as.POSIXct(data$timestamp_utc, tz = "UTC") 

然後你可以從dplyr使用功能rowwise,結合do

library(lubridate) 
library(dplyr) 
z <- data %>% rowwise() %>% 
       do(timestamp_local = with_tz(.$timestamp_utc, tzone = .$local_tz)) 
data$timestamp_local <- z$timestamp_local 

data$timestamp_local 
[[1]] 
[1] "2015-11-17 22:55:04 EST" 

[[2]] 
[1] "2015-11-17 19:55:08 PST" 

[[3]] 
[1] "2015-11-17 22:55:10 EST" 

我們需要使timestamp_local列成爲一個列表,否則所有時區都會被轉換回一個,您只能在矢量中有一個時區)。

+0

This Works!雖然速度很慢。我不知道'with_tz'是否可以被矢量化。我將跳轉到github並將其作爲功能請求提交。 – josiekre

+0

實際上這沒有奏效。它使所有三行的偏移量相同。答案應該是紐約和印第安納波利斯的-0500,洛杉磯的-0800。 – josiekre

+0

呃,現在應該修復了 – jeremycg