【问题标题】:Inconsistency with as.difftime与 as.difftime 不一致
【发布时间】:2018-08-02 16:40:56
【问题描述】:

我可以将包含小时、分钟或秒规格的字符串转换为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", "%…")

我是否忽略了什么?

【问题讨论】:

  • 它不能工作超过几个小时。如果您研究代码,为什么应该很明显。相关部分是difftime(strptime(tim, format = format), strptime("0:0:0", format = "%X"), units = units)。如果您只为strptime 指定时间,它会添加当前日期。如果你只指定日期的一部分,它会做一些令人惊讶的事情,尤其是几周。
  • @Roland - 我没有想到我可以多么轻松地研究代码。如果您将评论放入答案中,我可以接受。
  • 实际上,我认为您应该将这一点提交给 R-devel 邮件列表。我认为这至少是一个文档问题。但也许 R-core 甚至可以修复它。
  • @Roland - 好的,我会这样做的。

标签: r


【解决方案1】:

罗兰指出:

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

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 在几天和几周内都无法使用,例如,strptime 不接受 0 天的值,尽管它作为间隔完全有效。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-04
    • 2018-12-24
    • 2013-04-02
    • 2014-07-21
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多