在POSIXct对象上使用which()会捕获错误的元素

时间:2018-08-29 21:46:22

标签: r date datetime posix posixct

我有一个数据框,其中有一个Date列。在原始文件中,日期保存为因子。所以我将它们转换为字符串。在这些字符串中,它们的格式为日/月/年小时:分钟,例如2014年5月27日15:42。然后,我使用strptime将这些字符串转换为POSIXct对象。

e$Date = as.character(e$Date)
e$Date = strptime(e$Date, tz = "UTC",  format = "%d/%m/%Y %H:%M")

输出中的所有内容看起来都很不错,因为现在的日期格式为“ 2014-05-27 15:42:00 UTC”。然而。当我使用which()查找“ 2016-02-14 00:51:00 UTC”之后的日期时,我得到了错误的日期!

 which(e$Date>"2016-02-14 00:51:00 UTC")

即使我的起点之后但在“ 2016-02-12 08:54”之前有几十个日期,该命令也会返回以“ 2016-02-12 08:54:00 UTC”开头的日期列表:不包含的“ 00 UTC”。它似乎提前了8或9个小时。

我知道我在时区上做错了。我在Subset dataframe based on POSIXct date and time greater than datetime using dplyr上看到了答案,这似乎与我的问题很接近。但是,我确实在原始的strptime命令中指定了时区(我也尝试使用as.POSIXct而不是strptime,并且存在相同的问题)。
谁能看到我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

您可能应该将其保留为POSIXlt日期时间(由strptime创建),然后与相应时区中的另一个datetime对象进行比较。例如:

x <- strptime(c("2018-08-30 08:04", "2018-08-30 08:05", "2018-08-30 08:06", 
"2018-08-30 08:07", "2018-08-30 08:08"), format="%Y-%m-%d %H:%M", tz="UTC")
#[1] "2018-08-30 08:04:00 UTC" "2018-08-30 08:05:00 UTC"
#[3] "2018-08-30 08:06:00 UTC" "2018-08-30 08:07:00 UTC"
#[5] "2018-08-30 08:08:00 UTC"

文本比较给出奇怪的结果:

x > "2018-08-30 08:06:00 UTC"
#TRUE TRUE TRUE TRUE TRUE

日期时间比较:

x > as.POSIXlt("2018-08-30 08:06:00", tz="UTC")
#[1] FALSE FALSE FALSE  TRUE  TRUE