子集 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 对象相同的时区。
我有以下数据框,其中包含 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 对象相同的时区。