减去日期 - 小时和秒的差异?

Subtracting dates - difference in hours vs secs?

抱歉,我这里没有可重现的示例。

任何人都可以解释或猜测为什么这些差异之一在几天内出现,而另一个在几秒钟内出现?

> str(dat)
$ Date.Of.Visit           : chr  "2010-02-11" "2010-05-13" "2012-10-16" "2014-03-24" ...
$ Date.Diagnosed          : chr  "2003-08-23" "2003-08-23" "2003-08-23" NA ...
$ Date.Of.Birth           : chr  "1992-01-19" "1992-01-19" "1992-01-19" NA ...

看起来都一样。

dat$Date.Of.Visit <- ymd(dat$Date.Of.Visit)
dat$Date.Diagnosed <- ymd(dat$Date.Diagnosed)
dat$Date.Of.Birth <- ymd(dat$Date.Of.Birth)

全部通过相同的润滑功能。

> class(dat$Date.Of.Visit)
[1] "POSIXct" "POSIXt" 
> class(dat$Date.Of.Birth)
[1] "POSIXct" "POSIXt" 
> class(dat$Date.Diagnosed)
[1] "POSIXct" "POSIXt" 

看起来都一样。

> (dat$Date.Of.Visit - dat$Date.Of.Birth)[1:10]
Time differences in days
 [1] 6598 6689 7576   NA 3043 3141 3218 6784 4813 4974

> (dat$Date.Diagnosed - dat$Date.Of.Birth)[1:10]
Time differences in secs
 [1] 365817600 365817600 365817600        NA 256003200 256003200 256003200 243302400 194486400 194486400

我唯一能想到的是 Date.Of.Visit 是完整的,Date.Of.Birth 和 Date.Diagnosed 有一些缺失的数据。

如果没有您的原始数据,很难得出结论性的答案,但请看一下 difftime 的代码,它用于减去 POSIXct 个对象:

> difftime
function (time1, time2, tz, units = c("auto", "secs", "mins",
    "hours", "days", "weeks"))
{
    if (missing(tz)) {
        time1 <- as.POSIXct(time1)
        time2 <- as.POSIXct(time2)
    }
    else {
        time1 <- as.POSIXct(time1, tz = tz)
        time2 <- as.POSIXct(time2, tz = tz)
    }
    z <- unclass(time1) - unclass(time2)
    attr(z, "tzone") <- NULL
    units <- match.arg(units)
    if (units == "auto") {
        if (all(is.na(z)))
            units <- "secs"
        else {
            zz <- min(abs(z), na.rm = TRUE)
            if (is.na(zz) || zz < 60)
                units <- "secs"
            else if (zz < 3600)
                units <- "mins"
            else if (zz < 86400)
                units <- "hours"
            else units <- "days"
        }
    }
    switch(units, secs = .difftime(z, units = "secs"), mins = .difftime(z/60,
        units = "mins"), hours = .difftime(z/3600, units = "hours"),
        days = .difftime(z/86400, units = "days"), weeks = .difftime(z/(7 *
            86400), units = "weeks"))
}

因此,如果减法满足 any(is.na(z))min(abs(z), na.rm = TRUE) < 60,因为您没有指定 units,则单位将强制为秒。例如:

> difftime("2014-03-24", c(NA,NA,NA))
Time differences in secs
[1] NA NA NA

> difftime("2014-03-24", c('2010-01-01',NA,NA))
Time differences in days
[1] 1542.958       NA       NA

> difftime("2014-03-24", c('2010-01-01','2014-03-24',NA))
Time differences in secs
[1] 133311600         0        NA

最有可能的罪魁祸首是 Date.DiagnosedDate.Of.Birth 之间的某处差异不到一分钟——根据您在此处粘贴的内容,这些向量都不包含仅 NA 值,排除了 all(is.na(z)) 开关。