当我使用 POSIXct 库比较 R 中看似相同的日期时,当 R 看起来应该返回 TRUE 时,它仍然返回 FALSE。有什么看起来不对劲的地方吗?这是我的代码和输出。当我将日期写入文本文件并读回并将它们转换为 POSIXct 日期时,R 返回 FALSE 并且它们不是相同的日期。
#dataframe from previous source
data
write.table(data,"latest.txt",sep=",",col.names=TRUE,row.names=FALSE)
prev = read.delim("latest.txt",sep=",")
prev$date <- as.POSIXct(strptime(prev$date, format = "%Y-%m-%d %H:%M:%S", tz = "Etc/GMT-8"))
prev$date
data$date
class(prev$date)
class(data$date)
prev$date == data$date
此片段的输出
date V1
1 2021-09-16 22:05:32 100
[1] "2021-09-16 22:05:32 +08"
[1] "2021-09-16 22:05:32 +08"
[1] "POSIXct" "POSIXt"
[1] "POSIXct" "POSIXt"
[1] FALSE
这是我遇到问题的一些输入数据
structure(list(date = structure(1631804267.5, tzone = "Etc/GMT-8", class = c("POSIXct",
"POSIXt")), CO_RAMP = 258.183833333333, NO_RAMP = 9.85633333333333,
NO2_RAMP = 16.3028333333333, O3_RAMP = 15.3968333333333,
CO2_RAMP = 242.283333333333, T_RAMP = 13.6633333333333, RH_RAMP = 65.675,
PM1_RAMP = 2.20083333333333, PM_RAMP = 2.90366666666667,
PM10_RAMP = 2.98666666666667), class = "data.frame", row.names = c(NA,
-1L))
问题可以用 -
重现data <- data.frame(date = Sys.time())
write.table(data,"latest.txt",sep=",",col.names=TRUE,row.names=FALSE)
prev = read.delim("latest.txt",sep=",")
prev$date <- as.POSIXct(prev$date)
prev$date
#[1] "2021-09-17 14:08:48 +08"
data$date
#[1] "2021-09-17 14:08:48 +08"
class(prev$date)
#[1] "POSIXct" "POSIXt"
class(data$date)
#[1] "POSIXct" "POSIXt"
prev$date == data$date
#[1] FALSE
如果你删除属性并比较两个角色的时间,它会起作用。
as.character(prev$date) == as.character(data$date)
#[1] TRUE
但是,我认为这是一个时区问题。如果您将时区保留为 UTC,它将按预期工作。
data <- data.frame(date = as.POSIXct(as.character(Sys.time()), tz = 'UTC'))
write.table(data,"latest.txt",sep=",",col.names=TRUE,row.names=FALSE)
prev = read.delim("latest.txt",sep=",")
prev$date <- as.POSIXct(prev$date, tz = 'UTC')
prev$date == data$date
#[1] TRUE
我遇到了同样的问题 - 两个对象看起来相同(值),但将它们与
==
或 identical()
进行比较将返回 FALSE
要直观地了解原因,请使用
attributes()
函数。
就我而言,它们具有不同的属性