R 将我的变量视为 NA,即使它们已通过 strptime 或 as.POSIXct 成功转换

R treats my variable as NA even though they are converted successfully by strptime or as.POSIXct

d$Accessed.Time<-strptime(d$accessed_at,format="%Y-%m-%d %H:%M:%S")
d$Counselor.Added.Time<-strptime(d$counselor_added_at,format="%Y-%m-%d %H:%M:%S")
d$logtime<-as.numeric(d$Accessed.Time-d$Counselor.Added.Time,units="days")
View(d[which(is.na(d$logtime)),
c("accessed_at","Accessed.Time","counselor_added_at","Counselor.Added.Time","logtime")])

首先我将d$accessed_atd$counselor_added_at转换为R日期时间变量并对其进行算术运算并存储在d$logtime中。最奇怪的是R会把某些d$Counselor.Added.Time当成NA,即使它们转换成功

上面的屏幕截图是 R

中最后一个 View 语句的截图

is.na() 将 return TRUE for Counselor.Added.Time 对于所有这些观察结果,然后即使它们看起来已成功转换,对它们进行算术运算也会失败。

有人知道这是怎么回事吗?

看来这个错误是特定于这些特定时间的

我试过这个: a<-strptime("2015-03-08 02:33:07",format="%Y-%m-%d %H:%M:%S")is.na(a) returned TRUE

你可能会因为夏令时的变化而产生令人困惑的行为。
例如,在澳大利亚墨尔本,2012 年 10 月 7 日的 2:30 am 时间并不存在,因为时钟从凌晨 2 点向前移动了一个小时到凌晨 3 点。如果我们尝试使用那个时间,R 将 return NA。

ISOdatetime(2012,10,7,2,30,0, tz='Australia/Melbourne')

[1] NA

strptime 的行为很有趣,转换完成,值看起来不错,但实际上它丢失了。

x <- strptime('2012-10-7 2:30:0',format="%Y-%m-%d %H:%M:%S", tz='Australia/Melbourne')
x
#[1] "2012-10-07 02:30:00"
is.na(x)
#[1] TRUE
as.numeric(x)
# NA

让我们尝试一个确实存在的时间

x <- strptime('2012-10-7 3:30:0',format="%Y-%m-%d %H:%M:%S", tz='Australia/Melbourne')
x
#[1] "2012-10-07 03:30:00 AEDT"
is.na(x)
# [1] FALSE

如果您将时区指定为 UTC,这些问题就会消失

x <- strptime('2012-10-7 2:30:0',format="%Y-%m-%d %H:%M:%S", tz='UTC')
#[1] "2012-10-07 02:30:00 UTC"

另一个棘手的事情是,默认情况下,时区可以从您的计算机使用的任何时区获取。代码是否有效取决于您 运行 它是在夏季(夏令时)还是冬季。始终指定时区而不是依赖默认值是最安全的。