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

问题描述 投票:1回答:1

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

see the image for example

R中这个问题的代码是什么?

r datetime
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.