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_at
和d$counselor_added_at
转换为 R Datetime变量,并对其执行算术运算并将其存储在d$logtime
中。最奇怪的是 R 会将某些d$Counselor.Added.Time
视为NA
,即使它们已成功转换。
上面的屏幕截图是R
中的最后一个View
语句
对于所有这些观察, is.na()
将为TRUE
返回Counselor.Added.Time
,然后即使它们似乎已成功转换,也会对它们进行算术运算失败。
有谁知道发生了什么?
似乎此错误特定于这些特定时间
我试过这个:
a<-strptime("2015-03-08 02:33:07",format="%Y-%m-%d %H:%M:%S")
和
is.na(a)
已返回TRUE
答案 0 :(得分:1)
夏令时的变化会让您感到困惑 例如,在澳大利亚墨尔本,2012年10月7日凌晨2:30的时间不存在,因为时钟从凌晨2点到凌晨3点向前移动一小时。如果我们试图使用那个时间,R将返回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"
另一个棘手的问题是,默认情况下,时区可以从您的计算机使用的任何时区进行。代码可能有效或无效,具体取决于您是在夏季(夏令时)还是冬季运行。最安全的是始终指定时区而不是依赖默认值。