我只想考虑几天和几个月的时间差。 例如:
> 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。
编辑: we年不应该考虑,因为我们只需要一个近似值,并且返回值不必精确。
答案 0 :(得分: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 :(得分:1)
对于日期跨越2月底且一年是a年而又不是的情况,这个问题没有很好地定义,但如果忽略这一点,我们可以将每个日期中的年份替换为leap年(如果其中一个是a年)年(2000年)和非a年(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
发帖人在评论中指出,我们可以忽略leap年带来的问题。在这种情况下,我们可以选择a年作为替换日期,以便它始终返回答案。我们在下面做。我们不再需要润滑来检查日期是否为leap年。
as.Date(sub("....", 2000, d1)) - as.Date(sub("....", 2000, d2))
## Time difference of -1 days
(或者,我们可以选择不是that年的年份,并且由于大多数年份都不是leap年,因此跨越日期的休假更可能不会是一天;但是,如果其中一个年份是leap年,那将是失败的代价。日期是2月29日。)
答案 2 :(得分:1)
如果允许我们更近似一点,忽略leap年,则可以通过使用%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
答案 3 :(得分:0)
另一种解决方案可能是只提取每个日期中的一年中的某天,然后进行数学运算,特别是如果leap年 很重要。
例如,以下各项的常见问题解答:
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?获取DoY的建议。