代码之家  ›  专栏  ›  技术社区  ›  Jesper.Lindberg

仅计算月和日的时差

  •  0
  • Jesper.Lindberg  · 技术社区  · 7 年前

    我想只考虑天和月来计算时差。 例如:

    > as.Date("2018-12-15")-as.Date("2018-12-16")
    Time difference of -1 days
    
    > as.Date("2008-12-15")-as.Date("2018-12-16")
    Time difference of -3653 days
    

    我要他们两个都返回-1。

    编辑: 不应考虑闰年,因为我们只需要一个近似值,而返回值不需要是精确的。

    4 回复  |  直到 7 年前
        1
  •  1
  •   G. Grothendieck    7 年前

    对于跨越2月底和1年的日期是闰年的情况,这个问题没有很好的定义,我们可以用闰年(2000年)和非闰年(1999年)来代替每个日期中的年份,否则减去:

    library(lubridate)
    
    d1 <- "2008-12-15"
    d2 <- "2018-12-16"
    
    yr <- 1999 + (leap_year(as.Date(d1)) || leap_year(as.Date(d2)))
    as.Date(sub("....", yr, d1)) - as.Date(sub("....", yr, d2))
    ## Time difference of -1 days
    

    补充

    在评论中,海报指出我们可以忽略闰年带来的问题。在这种情况下,我们可以选择闰年作为替代日期,这样它总是返回一个答案。我们在下面做。我们不再需要Lubridate来检查日期是否为闰年。

    as.Date(sub("....", 2000, d1)) - as.Date(sub("....", 2000, d2))
    ## Time difference of -1 days
    

    (或者,我们可以选择一个不是闰年的年份,因为大多数年份都不是闰年,跨日期更不可能有一天休息;但是,如果其中一个日期是2月29日,那将以失败为代价。)

        2
  •  2
  •   Ronak Shah    7 年前

    正如@omry atia所建议的,我们可以将years组件设置为同一年,然后计算差额。

    library(lubridate)
    
    get_difference_without_years <- function(x, y) {
        x <- ymd(x)
        year(x) <- 2018
        y <- ymd(y)
        year(y) <- 2018
        x - y
    }
    
    
    get_difference_without_years("2018-12-15", "2018-12-16")
    #Time difference of -1 days
    
    get_difference_without_years("2008-12-15", "2018-12-16")
    #Time difference of -1 days
    

    把它放在R基

    get_difference_without_years <- function(x, y) {
      x <- as.Date(paste0("2018-", format(as.Date(x), "%m-%d")))
      y <- as.Date(paste0("2018-", format(as.Date(y), "%m-%d")))
      x - y
    }
    
    get_difference_without_years("2008-12-15", "2018-12-16")
    #Time difference of -1 days
    get_difference_without_years("2018-12-15", "2018-12-16")
    #Time difference of -1 days
    
        3
  •  1
  •   AkselA    7 年前

    如果允许我们更近似一点,忽略闰年,我们可以通过使用 %j (每年的某一天)在 format() .

    yd_diff <- function(x, y=NULL) {
        x <- as.integer(format(x, "%j"))
        if (is.null(y)) {
            diff(x)
        } else {
            x - as.integer(format(y, "%j"))
        }
    }
    
    d1 <- as.Date("2008-12-15")
    d2 <- as.Date("2018-12-16")
    yd_diff(d1, d2)
    # 0
    
    set.seed(1)
    rd <- as.Date(sample(1:10000, 5), origin="1970-01-01")
    yd_diff(rd)
    # -30  180   65 -123
    

    更简单的是,我们可以将日期转换为整数,并以一年中的模日为单位。优雅地说,r允许您使用带非整数的模。

    (as.integer(d1) %% 365.24) - (as.integer(d2) %% 365.24)
    # -0.6
    
    diff(as.integer(rd) %% 365.24)
    # -30.72  180.80   64.84 -123.44
    
        4
  •  0
  •   phase21    7 年前

    另一种解决方案可能是只从每个日期中提取一年中的某一天,然后进行数学运算,特别是在闰年时。 重要的。

    例如,以下各项的DOY:

    DayOfYear(2020, 12, 15) = 350   # leap year
    DayOfYear(2018, 12, 15) = 349
    DayOfYear(2016, 12, 15) = 350   # leap year
    DayOfYear(2011, 12, 16) = 350
    

    你可以找到很多关于如何从 extract day number of year from dates How do you convert POSIX date to day of year in R? .