使用以单位arg为单位的值月数的lubridate as.numeric中的意外值

时间:2017-03-02 18:46:17

标签: r lubridate

当我在lubridate包中使用as.numeric和period时,我无法理解以单位arg使用月份值的结果。 也许它是一个包?

$user = User::where('email', $userdata['email'])->first();

if($user->hasUsername()) 
{
   // do somethin
}

结果:

a <- period(years = 1, months = 3, days = 1)
as.numeric(a, 'days')
as.numeric(a, 'years')
as.numeric(a, 'months')

提前致谢

1 个答案:

答案 0 :(得分:1)

这看起来像个错误。我相信这种转换是使用lubridate:::seconds_to_unit完成的,在lubridate版本1.6.0上看起来像这样:

> lubridate:::seconds_to_unit
function (secs, unit = "second") 
{
    switch(unit, second = secs, minute = secs/60, hour = secs/3600, 
        day = secs/86400, month = secs/(86400 * 365.25)/12, week = secs/(86400 * 
            7), year = secs/(86400 * 365.25), stop("invalid unit ", 
            unit))
}
<environment: namespace:lubridate>

请注意这一部分:

month = secs/(86400 * 365.25)/12

显然,这里的想法是86400*365.25是每年的秒数,将其除以12每月的秒数。但它应该是:

month = secs/((86400 * 365.25)/12)

(注意附加的括号。)

由于这个错误,你得到的答案比它应该小144倍。

我相信这也是这个错误的原因:https://github.com/hadley/lubridate/issues/490

(它被描述为给出预期结果的倒数。这只是因为他们碰巧选择了12个月的间隔,所以除以144就会给你一个月的1/12。)