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

Unexpected value in lubridate as.numeric using value months in units arg

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

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

结果:

> as.numeric(a, 'days')
[1] 457.5625
> as.numeric(a, 'years')
[1] 1.252738
> as.numeric(a, 'months')
[1] 0.1043948
> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Linux Mint LMDE

locale:
 [1] LC_CTYPE=es_AR.UTF-8       LC_NUMERIC=C           LC_TIME=es_AR.UTF-8        LC_COLLATE=es_AR.UTF-8     LC_MONETARY=es_AR.UTF-8   
 [6] LC_MESSAGES=es_AR.UTF-8    LC_PAPER=es_AR.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=es_AR.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] dplyr_0.5.0            purrr_0.2.2            readr_1.0.0            tidyr_0.6.1            tibble_1.2            
  [6] ggplot2_2.2.1          tidyverse_1.1.1        pgr_0.0.9002           myutilities_0.0.0.9014 magrittr_1.5          
 [11] lubridate_1.6.0       

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.9       plyr_1.8.4        forcats_0.2.0     tools_3.3.2         jsonlite_1.2      gtable_0.2.0      nlme_3.1-128     
 [8] lattice_0.20-34   psych_1.6.12      DBI_0.5-1         RPostgreSQL_0.4-1 parallel_3.3.2    haven_1.0.0       stringr_1.1.0    
[15] httr_1.2.1        xml2_1.1.1        hms_0.3           grid_3.3.2        R6_2.2.0          readxl_0.1.1      foreign_0.8-67   
[22] reshape2_1.4.2    modelr_0.1.0      scales_0.4.1      assertthat_0.1    mnormt_1.5-5      rvest_0.3.2       colorspace_1.3-2 
[29] stringi_1.1.2     lazyeval_0.2.0    munsell_0.4.3     broom_0.4.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 个月。)