尝试根据某个 POSIXct 日期和时间之前或之后的日期对数据进行子集化时,我得到的结果不一致。当我制作这样的一串日期时:
myDates <- c(as.POSIXct("2014-12-27 08:10:00 UTC"),
as.POSIXct("2014-12-27 08:15:00 UTC"),
as.POSIXct("2014-12-27 09:30:00 UTC"))
然后尝试子集以查找 2014 年 12 月 27 日上午 8:15 之前myDates
中的所有条目,如下所示:
myDates[myDates < as.POSIXct("2014-12-27 08:15:00")]
工作正常,我得到
"2014-12-27 08:10:00 PST"
(虽然我不明白为什么它说时区为"PST";这就是我所在的地方,但我将其设置为 UTC)。
但是,我的原始日期和时间数据在Excel中,它们是数字格式。我将它们导入为名为 Samples 的数据帧,并通过执行以下操作将日期和时间列转换为 POSIXct 格式:
as.POSIXct(Samples$DateTime, origin = "1970-01-01", tz = "UTC")
现在,我对这些日期的子设置感到沮丧,直面办公桌。特别拿一个日期,x <- Samples$DateTime[34]
,根据 R 给我的输出,它是"2014-12-27 08:10:00 UTC"
.如果我检查 x 是否<2014-12-27 08:15,那应该是真的,这是我看到的:
x < as.POSIXct("2014-12-27 08:15:00 UTC")
TRUE
但是 x 不应该更少 2014-12-27 8:09:00 UTC,对吧?这是我看到的:
X < as.POSIXct("2014-12-27 08:09:00 UTC")
TRUE
为什么,为了皮特的爱,R告诉我8:10在8:09之前?!?对于我像上面这样输入的数据来说,这似乎不是问题,仅适用于我从 Excel 导入的数据。
您可能需要先在同一时区获取所有内容。尝试
as.numeric(as.POSIXct("2014-12-27 08:10:00 UTC", tz="UTC"))
#[1] 1419667800
# equivalent to "2014-12-27 08:10:00 UTC"
与。
as.numeric(as.POSIXct("2014-12-27 08:10:00 UTC"))
#[1] 1419631800
# equivalent to 8:10 in local timezone - in my case Aust. EST.
# "2014-12-27 08:10:00 AEST"
您可以看到它们实际上在数字上是不同的。
若要解决此问题,请在导入时显式指定tz=
,因为在输入时不会检测到文本字符串中的"UTC"
。
另外,要非常小心变量名称。可能您只是在这里输入了它,但是在问题的描述和您使用的第一个逻辑比较中x
,在第二个逻辑比较中,您使用了X
.
R 区分大小写,因此它不会将您的日期与存储在 x
中的日期进行比较。如果内存中存储了其他任何东西X
实际上可能是您提出的问题得到了正确的答案。