2016-11-09 80 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 
相关问题