日期间隔内的%

时间:2019-11-01 12:12:17

标签: r datetime lubridate

碰上一个真正的头颅抓手,不确定如何解决。真希望你们中的一些人能够提供帮助。此外,我第一次为StackOverflow做出贡献。...是的!

library(tidyverse)
library(lubridate)

start_date <- ymd("2014-06-28")
end_date <- ymd("2019-06-30")
PayPeriod_EndDate <- seq(start_date, end_date, by = '2 week')
PayPeriod_Interval <- int_diff(PayPeriod_EndDate)

这将创建一个间隔向量,每个间隔代表两个星期的支付期。这是第一部分,而第一部分则相对容易(尽管花了一段时间才弄清楚,哈)。

第二部分包含日期向量。

Dates <- c("2014-07-08", "2018-10-20", "2018-12-13", "2018-12-13", "2018-12-06", "2018-11-30", "2019-01-16", "2019-01-23", "2019-03-15", "2018-10-02")

我想确定日期 %within% 时间间隔,而输出是每个日期在其中的时间间隔。因此,日期"2014-07-08"将被分配为2014-06-28 UTC--2014-07-12 UTC,因为该日期在此间隔内。

这里似乎已经探索了一个非常相似的问题... https://github.com/tidyverse/lubridate/issues/658

我尝试了以下

ymd(Dates) %within% PayPeriod_Interval

但是,结果只计算 Dates 向量中的第一个元素。此后,我尝试了for循环,变异成因子等的各种组合,但是进展甚微。这是与工作相关的,因此确实会造成时间上的亏空,并将在全天和周末一直监视此帖子。

最好,谢谢! 詹姆斯

2 个答案:

答案 0 :(得分:2)

tidyverse非常有用,但是有时候,基R就是您所需要的。在这种情况下,您只需要cut函数。

library(lubridate)

start_date <- ymd("2014-06-28")
end_date <- ymd("2019-06-30")
PayPeriod_EndDate <- seq(start_date, end_date, by = '2 week')

Dates <- c("2014-07-08", "2018-10-20", "2018-12-13", "2018-12-13", "2018-12-06", "2018-11-30", "2019-01-16", "2019-01-23", "2019-03-15", "2018-10-02")


startperiod<-cut(as.Date(Dates), breaks=PayPeriod_EndDate)
endperiod<-as.Date(startperiod)+13

剪切功能的输出是“日期”变量所在的每个支付期的开始日期。

答案 1 :(得分:0)

这是map-解决方案的样子:

map(ymd(Dates), ~ PayPeriod_Interval[.x %within% PayPeriod_Interval])
# [[1]]
# [1] 2014-06-28 UTC--2014-07-12 UTC
# 
# [[2]]
# [1] 2018-10-13 UTC--2018-10-27 UTC
# 
# ...

要将结果作为间隔向量(而不是列表),可以使用:

PayPeriod_Interval[map_int(ymd(Dates), ~ which(.x %within% PayPeriod_Interval))]

# [1] 2014-06-28 UTC--2014-07-12 UTC 2018-10-13 UTC--2018-10-27 UTC 2018-12-08 UTC--2018-12-22 UTC 2018-12-08 UTC--2018-12-22 UTC 2018-11-24 UTC--2018-12-08 UTC
# [6] 2018-11-24 UTC--2018-12-08 UTC 2019-01-05 UTC--2019-01-19 UTC 2019-01-19 UTC--2019-02-02 UTC 2019-03-02 UTC--2019-03-16 UTC 2018-09-29 UTC--2018-10-13 UTC

如果您只对间隔的结束日期感兴趣,则选择一个选项

PayPeriod_EndDate[map_int(ymd(Dates), ~ which.min(.x > PayPeriod_EndDate))]
# [1] "2014-07-12" "2018-10-27" "2018-12-22" "2018-12-22" "2018-12-08" "2018-12-08" "2019-01-19" "2019-02-02" "2019-03-16" "2018-10-13"

which.min返回PayPeriod_EndDate的第一个日期的条目号,该条目号不小于Dates-vector中的特定日期,因此该日期位于特定付款期的末尾。