rbind 将 POSIXct 转换为字符 - 如何转换回 POSIXct?

rbind converts POSIXct to character - How to convert back to POSIXct?

尽管使用了 stringsASFactors = FALSE 参数,rbind() 正在将我的 POSIXct 向量转换为 class 字符。我查看了关于 cbind/rbind 类型函数的讨论以及它们如何处理 POSIXct(参见 , here, and here),但不幸的是它们在这种情况下没有帮助。

我在这里创建 POSIXct 向量作为数据框中行的基础。当我使用带 as.data.frame() 的 rbind() 并使用 stringsASFactors = FALSE 时,POSIXct 值更改为 class 字符。我知道是 rbind() 而不是 as.data.frame() 正在转换 class 并且似乎没有任何方法可以防止这种情况发生。

虽然我熟悉各种日期时间结构,但我做了一些研究,但我不知道它使用什么系统来存储日期时间或如何将其转换回来(是的,我已经尝试过 as.POSIXct()).

所以问题是,如何将它们转换回 POSIXct? (如果有一些神奇的方法可以让 rbind() 不将 POSIXct 转换为字符,我也会采用它。) 谢谢!

####Build example####
d1 <- as.POSIXct("2020-06-30 8:00")
d2 <- as.POSIXct("2020-06-30 9:00")
d3 <- as.POSIXct("2020-06-30 10:00")
d4 <- as.POSIXct("2020-06-30 16:00")
s1 <- c(d1, d2, d3, d4, "", "")  

d1 <- as.POSIXct("2020-06-30 8:00")
d2 <- as.POSIXct("2020-06-30 10:00")
d3 <- as.POSIXct("2020-06-30 11:00")
d4 <- as.POSIXct("2020-06-30 12:00")
d5 <- as.POSIXct("2020-06-30 12:30")
d6 <- as.POSIXct("2020-06-30 16:30")
s2 <- c(d1, d2, d3, d4, d5, d6)

d1 <- as.POSIXct("2020-06-30 8:00")
d2 <- as.POSIXct("2020-06-30 13:00")
d3 <- as.POSIXct("2020-06-30 13:45")
d4 <- as.POSIXct("2020-06-30 16:30")
s3 <- c(d1, d2, d3, d4, "", "")

d3 <- as.POSIXct("2020-06-30 13:25")
s4 <- c(d1, d2, d3, d4, "", "")

d2 <- as.POSIXct("2020-06-30 16:00")
s5 <- c(d1, d2, "", "", "", "")

####Build data frame####
timedata <- as.data.frame(rbind(s1, s2, s3, s4, s5), stringsAsFactors = FALSE)
names(timedata) <- c("T1", "T2", "T3", "T4", "T5", "T6")
for(c in seq(from = 1, to = 6, by = 1)) {
  timedata[,c] <- as.POSIXct(timedata[,c], tzone = "PDT")
}

P.S。 as.POSIXct() 有一些文档讨论了如何将具有特定来源的乱码转换回功能性 POSIXct。但是示例使用的是 SAS、SPSS、STATA 和 Matlab 提供的不同结构,而不是内部 R。

如果您在 rbind() 之前将 s1, ..., s5 包装在 as.character() 中,它的行为似乎如您所愿。

timedata <- as.data.frame(rbind(as.character(s1),
                                as.character(s2),
                                as.character(s3),
                                as.character(s4),
                                as.character(s5)), stringsAsFactors = FALSE)

然后你可以做你所做的并转换回来。

另一种选择是保持 rbind() 不变,然后按如下方式更改循环。这都归功于每个功能的支持类。

密钥隐藏在 help(as.POSIXct) 的注释部分。

the origin of time for the "POSIXct" class, ‘1970-01-01 00:00.00 UTC’

for(c in seq(from = 1, to = 6, by = 1)) {
  timedata[,c] <- as.POSIXct(as.numeric(timedata[,c]), origin = "1970-01-01 00:00:00", tzone = "PDT")
}