我有以下数据帧,其中包含时区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
有什么想法吗?
答案 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
在这里,两个行均被选中,因为它们都小于等于比较的日期时间。