java 多个日期 重叠_R / lubridate:计算两个时期之间的重叠天数

该博客探讨了如何在R中使用lubridate库计算两个日期区间之间的重叠天数,特别是在处理广告发布和结束日期时。作者展示了尝试的不同方法,包括直接计算和Excel公式转换,但遇到了问题。最后提到了@akrun提供的解决方案适用于ymd日期,但对于ymd_hms格式则无效。
摘要由CSDN通过智能技术生成

我想计算两个时间段之间的重叠天数 . 一个句点在开始和结束日期中固定,另一个在数据框中记录为开始日期和结束日期 .

编辑:我正在处理具有发布日期(df $ start)和未发布日期(df $ end)的广告 . 我想知道的是他们在特定月份在线的天数(my.start = 2018-01-01,my.end = 2018-08-31) .

library(dplyr)

library(lubridate)

my.start

my.end

df

end = c("2018-07-20", "2018-08-05", "2018-08-19", "2018-09-15", "2018-09-15"))

# strings to dates

df

# does not work - calculate overlap in days

df

结果应为0,5,4,12,0天:

my.start |-------------------------------| my.end

|-----| (0)

|---------| (5)

|----| (4)

|------------------| (12)

|---------------| (0)

在Excel中,我会使用

=MAX(MIN(my.end, end) - MAX(my.start, start) + 1, 0)

但这也不起作用:

# does not work - calculate via min/max

df

在我尝试在日期使用 as.numeric() 的Excel方法之前,我想知道是否有更聪明的方法来做到这一点 .

编辑:实际上,Excel数字方法似乎也没有两个工作(所有结果都为零):

# does not work - calculate via numeric

ms.num

me.num

df %

mutate(s.num = as.numeric(start),

e.num = as.numeric(end),

overlap = max(min(e.num, me.num) - max(s.num, ms.num) + 1, 0))

编辑:@akrun的方法似乎适用于ymd日期 . 但是,它似乎不适用于ymd_hms次:

library(dplyr)

library(lubridate)

library(purrr)

my.start

my.end

df

end = c("2018-07-20 10:00:00", "2018-08-05 10:00:00", "2018-08-19 10:00:00", "2018-09-15 10:00:00", "2018-09-15 10:00:00"))

# strings to dates

df

# leads to 0 results

df %>% mutate(overlap = map2(start, end, ~ sum(seq(.x, .y, by = '1 day') %in% seq(my.start, my.end, by = '1 day'))))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值