【问题标题】:Interconverting POSIXct and numeric in R在 R 中相互转换 POSIXct 和数字
【发布时间】: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 看起来像一个十进制数字而不是一个时间呢?

标签: r excel date time posixct


【解决方案1】:

我在这里找到了基于 chris holbrook 的答案的答案: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 的时区显然是 PST。当我检查str(mydata$DateTime2) 时,它没有列出“PST”,但根据时差,在我设置属性之前,它实际上一定是PST。疯狂的。即使 DateTime1 是格林威治标准时间,它也会这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多