仅在几个月和几天计算时差

问题描述 投票:0回答:4

我想仅考虑日期和月份来计算时差。例如:

> 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。

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

r datetime
4个回答
1
投票

对于日期跨越2月底和一年是闰年的情况,问题没有明确定义,一个不是忽略这一点,如果是闰年,我们可以用闰年替换每年的年份( 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

添加

在评论中,海报表明我们可以忽略闰年引入的问题。在这种情况下,我们可以选择一个闰年作为替换日期,以便它总是返回一个答案。我们在下面这样做。我们不再需要重新检查日期是否为闰年。

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

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


2
投票

正如@Omry Atia所建议的,我们可以将年份组件设置为同一年,然后计算差异。

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

1
投票

如果我们被允许更加近似,忽略闰年,我们可以通过在%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

0
投票

另一个解决方案可能是从每个日期仅提取日期,然后进行数学运算,特别是如果闰年很重要的话。

例如,以下内容的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 datesHow do you convert POSIX date to day of year in R?获得DoY的建议。

© www.soinside.com 2019 - 2024. All rights reserved.