子集 POSIXct 日期和时间 returns 错误的日期

Subsetting POSIXct date and time returns wrong date

我有以下数据框,其中包含 UTC 时区中 POSIXct 格式的日期和时间:

date<-c("2013-12-12","2014-01-01","2014-01-01","2014-01-01")
time<-c("23:00:00","00:00:00","01:00:00","02:00:00")
x<-data.frame(date,time)
x$Date2<-as.POSIXct(paste(x$date, x$time), format="%Y-%m-%d %H:%M:%S", tz="UTC")

将数据框子集化后:

x<-subset(x, Date2<="2014-01-01 00:00:00")

我没有得到正确的日期和时间:

        date     time               Date2
1 2013-12-12 23:00:00 2013-12-12 23:00:00

我不应该得到:

        date     time               Date2
1 2014-01-01 00:00:00 2014-01-01 00:00:00

知道为什么吗?

那是因为 "2014-01-01 00:00:00" 是一个字符串,而您正在将 POSIXct class 与字符 class 进行比较。将其转换为 POSIXct,它应该可以工作

subset(x, Date2 <= as.POSIXct("2014-01-01 00:00:00", tz = "UTC"))

#        date     time               Date2
#1 2013-12-12 23:00:00 2013-12-12 23:00:00
#2 2014-01-01 00:00:00 2014-01-01 00:00:00

此处,两行都被选中,因为它们都小于等于 date-time 比较。

这是一个时区问题。当您将字符串与 POSIXct 值进行比较时,它会将下面的字符串 s 转换为相对于会话当前默认时区的 POSIXct 值。

当我们更改会话的默认时区时,我们看到答案如何变化:

s <- "2000-01-01 00:00:00"

Sys.setenv(TZ = "GMT")
as.POSIXct(s, tz = "GMT") == s
## [1] TRUE

Sys.setenv(TZ = "")  # "" will set your TZ to your usual session default
as.POSIXct(s, tz = "GMT") == s
## [1] FALSE

因此,您可以将字符串显式转换为指定时区的 POSIXct,也可以将会话时区设置为与 POSIXct 对象相同的时区。