【发布时间】:2016-09-01 21:42:25
【问题描述】:
我正在从 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")
但这给了我接近 1970 年 1 月 1 日的日期和时间。
这更令人费解,但在我也尝试过的其他类似情况下起作用的一件事是:
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 的东西,那么您不应该对某处神秘地转换为系统时区的东西有问题。
建议?
【问题讨论】:
-
在转换前后检查
unclass(DateTime1)。之前和之后应该是相同的底层整数(技术上numeric)。如果是这样,只需设置正确的时区/原点即可。 -
感谢您的建议,但我看不出包含
unclass(...和不包含它之间有什么区别。 -
我可能理解错了,但是你为什么不能直接把
Time2加到DateTime1。我不确定Time2的单位,但假设是天,只是为了说明。然后,mydata$DateTime2 = mydata$DateTime1 + mydata$Time2*24*60*60(因为 POSIXct 以秒为单位,所以我们将Time2转换为秒)。 -
问题是我没有将第二个时钟时间添加到第一个时钟时间。相反,我只需要 DateTime1 中的日期和日期,然后我需要在 Time2 中添加时钟时间。
-
啊,好吧。但是为什么
Time2看起来像一个十进制数字而不是一个时间呢?