我正在尝试定义一个自定义函数来获取两个日期之间的年差,
到目前为止我得到的是:
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"
修复:
在
Date
和Class
之间没有来回移动;如果你想做年算术,只需转换为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"))