在 R 中相互转换 POSIXct 和数字

Interconverting POSIXct and numeric in R

我从 Excel 导入数据,然后尝试在 R 中操作日期和时间,这让我非常头疼。在 Excel 文件中,一列包含日期和时间,另一列包含同一天的不同时间。 R 中的数据基本上像这个例子:

 mydata <- data.frame(DateTime1 = as.POSIXct(c("2014-12-13 04:56:00",
                                         "2014-12-13 09:30:00",
                                         "2014-12-13 11:30:00",
                                         "2014-12-13 13:30:00"),
                                       origin = "1970-01-01", tz = "GMT"),
                      Time2 = c(0.209, 0.209, 0.715, 0.715))

我想要一个包含日期和第二次的 POSIXct 格式的新列,但我无法让它工作。我试过:

 mydata$DateTime2 <- as.POSIXct(as.numeric(as.Date(mydata$DateTime1)
                            + mydata$Time2), origin = "1970-01-01",
                           tz = "GMT")

但这给了我接近 1/1/1970 的日期和时间。

这更复杂,但在我也尝试过的其他类似情况下起作用的一件事是:

 library(lubridate)
 mydata$DateTime2 <- ymd_hms(format(as.POSIXct(as.Date(mydata$DateTime1) + 
                                                mydata$Time2,
                      origin = "1899-12-30", tz = "GMT")))

但这给了我 8 小时的日期和时间。这个时差让我觉得问题出在时区上,因为我使用的是太平洋标准时间,但我在输入数据和尝试转换时都 设置为 GMT!是什么赋予了?由于夏令时的复杂性,我犹豫是否只将 8 小时添加到所有内容中。

真的,我在这里列出的两种尝试似乎都存在相互转换的问题,即,如果您从 POSIXct 对象开始并将其转换为数字,然后再次将其转换回 POSIXct,您应该结束回到你开始的地方,你没有。类似地,如果您以 GMT 时区开始,然后添加一些也设置为 GMT 时区的内容,那么您应该不会遇到神秘地转换为系统时区的事情。

建议?

我根据克里斯·霍尔布鲁克在这里的回答找到了答案:How do you convert dates/times from one time zone to another in R?

这有效:

 mydata$DateTime2 <- as.POSIXct(as.Date(mydata$DateTime1) +
                                 mydata$Time2)
 attributes(mydata$DateTime2)$tzone <- "GMT"

@MichaelChirico 和我是正确的,时区是问题所在。我仍然不确定为什么,但 DateTime2 的时区显然是太平洋标准时间。我检查str(mydata$DateTime2)时没有list"PST",但是根据时差,它必须是,事实上,PST,直到我设置属性.疯狂的。即使 DateTime1 是 GMT,它也这样做了。