R如何在R中以30天为间隔分割给定时间段

时间:2018-07-04 17:11:50

标签: r datetime

我有订单ID,开始日期和结束日期的数据。我必须将开始日期和结束日期均分为 30天间隔,并导出两个新变量“开始时间拆分”和“开始时间拆分”结束日期”。 示例:下例说明了开始日期为“ 01/05/2017”且结束日期为“ 06/07/2017”时如何创建拆分日期 假设一个订单的开始日期和结束日期如下

see the image for example

R中解决此问题的代码是什么?

1 个答案:

答案 0 :(得分:0)

这里是一个解决方案,应该推广到多个订单ID。我创建了带有两个订单ID的示例数据。基本思想是计算start_dateend_date之间的间隔数。然后,我们将每个订单ID的行重复间隔的数量,并创建一个序列来确定我们所处的间隔。这是创建函数fg以及使用Map

剩下的只是矢量操作,我们在其中定义了split_start_datesplit_end_date。最后一条语句是确保split_end_date不超过end_date

df <- data.frame(
  order_id = c(1, 2),
  start_date = c(as.Date("2017-05-01"), as.Date("2017-08-01")),
  end_date = c(as.Date("2017-07-06"), as.Date("2017-09-15"))
)
df$diff_days <- as.integer(df$end_date - df$start_date)
df$num_int <- ceiling(df$diff_days / 30)
f <- function(rowindex) {
  rep(rowindex, each = df[rowindex, "num_int"])
}
g <- function(rowindex) {
  1:df[rowindex, "num_int"]
}
rowindex_rep <- unlist(Map(f, 1:nrow(df)))
df2 <- df[rowindex_rep, ]
df2$seq <- unlist(Map(g, 1:nrow(df)))
df3 <- df2
df3$split_start_date <- df3$start_date + (df3$seq - 1) * 30
df3$split_end_date <- df3$split_start_date + 29
df3[which(df3$seq == df3$num_int), ]$split_end_date <-
  df3[which(df3$seq == df3$num_int), ]$end_date