首页 > 解决方案 > 与 as.difftime 不一致

问题描述

我可以将包含小时、分钟或秒规范的字符串转换为difftime

> as.difftime("12 h", "%H")
Time difference of 12 hours
> as.difftime("12 m", "%M")
Time difference of 12 mins
> as.difftime("12 s", "%S")
Time difference of 12 secs

但是我不能用一周的规范这样做,因为没有合适的格式……,虽然"weeks"是一个合法的单位difftime

> as.difftime("12 w", "%…")

我忽略了什么吗?

标签: r

解决方案


罗兰指出:

它不能工作超过几个小时。……很明显,如果你研究代码的话。相关部分是

difftime(strptime(tim, format = format), strptime("0:0:0", format = "%X"), units = units)

. 如果您仅指定时间,strptime则添加当前日期。

实际上,在R 控制台中研究代码很容易:

> as.difftime
function (tim, format = "%X", units = "auto") 
{
    if (inherits(tim, "difftime")) 
        return(tim)
    if (is.character(tim)) {
        difftime(strptime(tim, format = format), strptime("0:0:0", 
            format = "%X"), units = units)
    }
    else {
        if (!is.numeric(tim)) 
            stop("'tim' is not character or numeric")
        if (units == "auto") 
            stop("need explicit units for numeric conversion")
        if (!(units %in% c("secs", "mins", "hours", "days", "weeks"))) 
            stop("invalid units specified")
        .difftime(tim, units = units)
    }
}

问题的症结在于,使用strptime导致给定的时间间隔字符串as.difftime被视为时间点,从中 减去当天的0 h。由于各种原因,这使得as.difftime字符串在几天和几周内都无法使用,例如 0 天的值不被 接受strptime,尽管它作为间隔完全有效。

对 R-devel 邮件列表的评论请求没有引起广泛的回应。(我通过私人邮件从 Emil Bode 收到了一些有价值的想法,因此我不会在这里复制它们。)因此,我将避免对 提出更改as.difftime,因为更改它会导致 R 版本之间的差异。


推荐阅读