【问题标题】:How to adjust a customized function to get the difference between years?如何调整自定义功能以获得年份之间的差异?
【发布时间】:2021-02-22 19:27:09
【问题描述】:

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

这是我目前得到的:

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。 但是我无法弄清楚函数中缺少什么,

有没有什么方法可以调整功能以获得想要的结果?

【问题讨论】:

    标签: r function date


    【解决方案1】:

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

    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"))
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      相关资源
      最近更新 更多