【问题标题】:rbind converts POSIXct to character - How to convert back to POSIXct?rbind 将 POSIXct 转换为字符 - 如何转换回 POSIXct?
【发布时间】:2020-10-21 03:24:25
【问题描述】:

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

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

虽然我熟悉各种日期时间结构,但我做了一些研究,但我不知道它使用什么系统来存储日期时间或如何将其转换回来(是的,我已经尝试过 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")
}

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

【问题讨论】:

  • rbind 函数产生一个矩阵,所以所有列都是相同的类型,POSIXct 不是可能的类型之一:参见?rbind。最好创建一个字符串矩阵,然后将每一列最后转换为POSIXct。

标签: r dataframe character posixct rbind


【解决方案1】:

如果您将 s1, ..., s5 包装在 as.character() 之前 rbind() ,它似乎可以按照您的意愿行事。

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) 的注释部分。

“POSIXct”类的时间起源,‘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")
}

【讨论】:

  • 啊,你是一颗宝石!太感谢了。我完全错过了帮助(as.POSIXct)的注释部分中的原始注释。适应原点似乎是更有效的解决方案,因为将 as.character() 包装在每个 POSIXct 向量周围会更加乏味。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多