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

时间:2015-12-16 19:43:25

标签: r datetime na strptime

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 Datetime变量,并对其执行算术运算并将其存储在d$logtime中。最奇怪的是 R 会将某些d$Counselor.Added.Time视为NA,即使它们已成功转换。

R treats my datetime variable as NA even though it's converted successfully

上面的屏幕截图是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

1 个答案:

答案 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"

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