子集POSIXct日期和时间返回错误的日期

时间:2019-06-06 09:38:15

标签: r posixct

我有以下数据帧,其中包含时区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

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

这是时区问题。当您将字符串与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对象相同的时区。

答案 1 :(得分:1)

这是因为"2014-01-01 00:00:00"是一个字符串,并且您正在将POSIXct类与一个字符类进行比较。将其转换为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

在这里,两个行均被选中,因为它们都小于等于比较的日期时间。