使用带有“>”的POSIXct的问题和“<”在R

时间:2016-04-28 22:34:01

标签: r excel date time timezone

当尝试根据某个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"))

然后尝试子集以查找myDates中2014年12月27日上午8:15之前的所有条目,如下所示:

 myDates[myDates < as.POSIXct("2014-12-27 08:15:00")]

工作正常,我得到了

 "2014-12-27 08:10:00 PST"

(虽然我不明白为什么它为时区说“PST”;那就是我,但我把它设置为UTC)。

但是,我的原始日期和时间数据是在Excel中,它们是数字格式。我将它们作为一个名为Samples的data.frame导入,并通过执行以下操作将日期和时间列转换为POSIXct格式:

 as.POSIXct(Samples$DateTime, origin = "1970-01-01", tz = "UTC")

现在,我正在对这些日期的分组进行扯皮,头上desk frust frust的挫败感。特别记录一个日期x <- Samples$DateTime[34],根据输出R给出的"2014-12-27 08:10:00 UTC" x < as.POSIXct("2014-12-27 08:15:00 UTC") TRUE 。如果我检查x&lt; 2014-12-27 08:15,那应该是真的,这就是我所看到的:

 X < as.POSIXct("2014-12-27 08:09:00 UTC")

 TRUE

但是x不应该少于2014-12-27 8:09:00 UTC,对吗?这就是我所看到的:

#ifdef DEBUG

#import <UIKit/UIKit.h>
#import <objc/runtime.h>

@implementation UIView (FixViewDebugging)

+ (void)load
{
    Method original = class_getInstanceMethod(self, @selector(viewForBaselineLayout));
    class_addMethod(self, @selector(viewForFirstBaselineLayout), method_getImplementation(original), method_getTypeEncoding(original));
    class_addMethod(self, @selector(viewForLastBaselineLayout), method_getImplementation(original), method_getTypeEncoding(original));
}

@end

#endif

为什么,为了皮特的爱,R告诉我8:10 8:09之前是?对于我刚才输入的数据,这似乎不是问题,仅适用于我从Excel导入的数据。

2 个答案:

答案 0 :(得分:2)

您可能需要先在同一时区内获取所有内容。试试

as.numeric(as.POSIXct("2014-12-27 08:10:00 UTC", tz="UTC"))
#[1] 1419667800
# equivalent to "2014-12-27 08:10:00 UTC"

VS

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"

答案 1 :(得分:0)

另外,要非常小心变量名称。可能你只是在这里输入了它,但是在问题的描述和你使用x的第一个逻辑比较中,在第二个中使用了X

R区分大小写,因此不会将您的日期与x中存储的日期进行比较。如果其他任何内容与X一起存储在内存中,实际上可能是您为所提问题提供了正确的答案。