仅在几个月和几天计算时差
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅在几个月和几天计算时差相关的知识,希望对你有一定的参考价值。
我想仅考虑日期和月份来计算时差。例如:
> 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。
编辑:不应考虑闰年,因为我们只想要一个近似值,并且返回值不需要精确。
对于日期跨越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日。)
正如@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
如果我们被允许更加近似,忽略闰年,我们可以通过在%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
另一个解决方案可能是从每个日期仅提取日期,然后进行数学运算,特别是如果闰年很重要的话。
例如,以下内容的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?获得DoY的建议。
以上是关于仅在几个月和几天计算时差的主要内容,如果未能解决你的问题,请参考以下文章