r语言 - 如何调整自定义函数以获得年份之间的差异?



我正在尝试定义一个自定义函数来获取两个日期之间的年差,

到目前为止我得到的是:

library(lubridate)
## function to get the difference between years ##
set_dif_years <- function(end_date, start_date){
return(lubridate :: year(end_date)- lubridate :: year(start_date))
}
## testing function ##
set_dif_years(end_date=format(as.Date('01/08/2019', format='%d/%m/%Y'), "%d/%m/%Y"),
start_date=format(as.Date('28/08/2019', format='%d/%m/%Y'), "%d/%m/%Y"))

控制台输出:

# -27

在这种情况下,期望的函数输出应该是0。然而,我不能找出什么是缺失的功能,

是否有任何方法来调整功能,以获得所需的结果?

当您得到不符合逻辑的结果时,请查看所有中间对象。

format(as.Date('01/08/2019', format='%d/%m/%Y'), "%d/%m/%Y")
# [1] "01/08/2019"
lubridate::year(format(as.Date('01/08/2019', format='%d/%m/%Y'), "%d/%m/%Y"))
# [1] 1

明白了吗?让我们看看另一个。

format(as.Date('28/08/2019', format='%d/%m/%Y'), "%d/%m/%Y")
# [1] "28/08/2019"
lubridate::year(format(as.Date('28/08/2019', format='%d/%m/%Y'), "%d/%m/%Y"))
# [1] 28

这是因为您的lubridate::year使用as.POSIXlt,没有候选日期格式,它认为第一个数字是年。(不要混淆人眼明显和机器明显/明确)

as.POSIXlt(format(as.Date('01/08/2019', format='%d/%m/%Y'), "%d/%m/%Y"))
# [1] "0001-08-20 LMT"
as.POSIXlt(format(as.Date('28/08/2019', format='%d/%m/%Y'), "%d/%m/%Y"))
# [1] "0028-08-20 LMT"

修复:

  • DateClass之间没有来回移动;如果你想做年算术,只需转换为Date类并坚持使用它

    set_dif_years(end_date=as.Date('01/08/2019', format='%d/%m/%Y'),
    start_date=as.Date('28/08/2019', format='%d/%m/%Y'))
    
  • 如果您必须使用character,但是,由于year不接受大多数日期/日期时间函数允许的format=,您需要将其设置为一个明确的字符串:

    set_dif_years(end_date=format(as.Date('01/08/2019', format='%d/%m/%Y'), "%Y/%m/%d"),
    start_date=format(as.Date('28/08/2019', format='%d/%m/%Y'), "%Y/%m/%d"))
    

最新更新