2016-11-09 78 views
-1

我有一個包含兩個字符變量的數據框:一個是時間戳,另一個是美國狀態。 我試圖將每個時間戳轉換爲一個POSIX對象失敗,其中時區根據相應的狀態值分配:佛羅里達州(FL)的東部時間(EST)和德克薩斯州(TX)的中央時間(CST6CDT)。
但是,無論我嘗試什麼,R將只返回單個時區中的所有時間戳,或者返回包含自原點後的秒數的字符串。 我當然可以將字符串轉換爲POSIX對象,但我來了整整一圈,無法聲明多個時區。 我也嘗試過用循環代替索引,但這也不起作用。R如何將時間戳轉換爲同一列中的多個時區

我會特別想知道發生了什麼事。我的猜測(或許是不正確的)是問題與列中聲明的數據類型有關,因爲這可以解釋例3中發生的事情。 但是,無論我讀過什麼或嘗試過什麼,我都找不到讓這個工作。

實施例1 - 轉換DF $時間爲POSIX對象,然後試圖通過DF $狀態

df <- data.frame(time = c("2010-03-05 07:03:00", "2010-03-05 16:00:00", "2010-03-06 07:01:00"), state = c("FL", "FL", "TX")) 
df$time <- as.character(df$time); df$state <- as.character(df$state) 
df$time <- as.POSIXct (strptime(df$time, "%Y-%m-%d %H:%M:%S")) 
df$time 
#----- 
#[1] "2010-03-05 07:03:00 PST" "2010-03-05 16:00:00 PST" "2010-03-06 07:01:00 PST" 

df$time分配不同的時區已經被成功地轉換爲POSIX對象。但是,當我嘗試按狀態分配時區時,時區將保持它初始化的任何狀態(在我的位置,即PST)。

df$time[df$state == "FL"] <- as.POSIXct (strptime(df$time[df$state == "FL"], "%Y-%m-%d %H:%M:%S"), tz = "EST" 
df$time[df$state == "TX"] <- as.POSIXct (strptime(df$time[df$state == "TX"], "%Y-%m-%d %H:%M:%S"), tz = "CST6CDT") 
df$time 
#[1] "2010-03-05 04:03:00 PST" "2010-03-05 13:00:00 PST" "2010-03-06 05:01:00 PST" 

例2 - 嘗試使用df $時間字符串直接轉換到每個國家的時區沒有第一converti

ng the string to a POSIX object 

df <- data.frame(time = c("2010-03-05 07:03:00", "2010-03-05 16:00:00", "2010-03-06 07:01:00"), state = c("FL", "FL", "TX")) 
df$time <- as.character(df$time); df$state <- as.character(df$state) 
df$time 
#[1] "2010-03-05 07:03:00" "2010-03-05 16:00:00" "2010-03-06 07:01:00" 
df$time[df$state == "FL"] <- as.POSIXct (strptime(df$time[df$state == "FL"], "%Y-%m-%d %H:%M:%S"), tz = "EST") 

df$time[df$state == "TX"] <- as.POSIXct (strptime(df$time[df$state == "TX"], "%Y-%m-%d %H:%M:%S"), tz = "CST6CDT") 
df$time 
[1] "1267790580" "1267822800" "1267880460" 

例3 - 雖然我可以採取DF $時間字符串由示例2中的代碼生成併成功將它們轉換爲EST ...

as.POSIXct(as.numeric(df$time[df$state == "FL"]), origin = "1970-01-01", tz = "EST") 

#[1] "2010-03-05 07:03:00 EST" "2010-03-05 16:00:00 EST" 

#...但是如果我嘗試將這些對象傳遞迴數據框,則R會將它們轉換回字符串,然後我會完整循環。

df$time[df$state == "FL"] <- as.POSIXct(as.numeric(df$time[df$state == "FL"]), origin = "1970-01-01", tz = "EST") 
df$time 
#[1] "1267790580" "1267822800" "1267880460" 
+0

那麼這是一個真正的PITA來編輯。學習如何正確使用SO降價格式功能,並且不要過於粗暴地演示。取消「提前致謝」和禮貌請求,因爲這些對於SO來說是明確的棄用。這是「只是事實,女士」專區。 R不支持混合時區向量。需要拿出一個備用。財務人員已經做了很長時間了,所以我建議搜索。內部時間都是GMT。 –

+0

我不確定R支持具有不同時區的POSIXct對象向量。也許你可以在時間列旁邊製作一個「tz」列來定義你想要的時區。 – giraffehere

回答

0

根據註釋,R無法處理單個向量中的多個時區。因此,如果其他人試圖解決同樣的問題,我可以提供一個簡單而有效的解決方法。

首先,爲每個時區創建單獨的向量,並將POSIX對象設置爲每個時區的本地時間,然後將各個向量合併到一個新向量中,並將POSIX對象設置爲UTC/GMT(或其他單個時區你的選擇)。

df <- data.frame(time = c("2010-03-05 07:03:00", "2010-03-05 16:00:00", "2010-03-05 08:27:00"), state = c("FL", "FL", "TX")) 

df$time <- as.character(df$time); df$state <- as.character(df$state) 

df$timeFL[df$state == "FL"] <- as.POSIXct (strptime(df$time[df$state == "FL"], "%Y-%m-%d %H:%M:%S"), tz = "EST") 

df$timeFL <- as.POSIXct(df$timeFL, origin = "1970-01-01", tz = "EST") 

df$timeTX[df$state == "TX"] <- as.POSIXct (strptime(df$time[df$state == "TX"], "%Y-%m-%d %H:%M:%S"), tz = "CST6CDT") 

df$timeTX <- as.POSIXct(df$timeTX, origin = "1970-01-01", tz = "CST6CDT") 

df$common.time.UTC[!is.na(df$timeFL)] <- df$timeFL[!is.na(df$timeFL)] 

df$common.time.UTC[!is.na(df$timeTX)] <- df$timeTX[!is.na(df$timeTX)] 

df$common.time.UTC <- as.POSIXct(df$common.time.UTC, origin = "1970-01-01", tz = "UTC") 

df$timeFL <- NULL; df$timeTX <- NULL 

df 

time    state  common.time.UTC 
2010-03-05 07:03:00 FL 2010-03-05 12:03:00 
2010-03-05 16:00:00 FL 2010-03-05 21:00:00 
2010-03-05 08:27:00 TX 2010-03-05 14:27:00 
相關問題