【问题标题】:function for accurate end date based on specified interval基于指定时间间隔的准确结束日期功能
【发布时间】:2016-11-28 21:21:02
【问题描述】:

我正在开发一个函数来创建一个包含 StartDate 和 EndDate 的 2 列 df。我将提供 3 个参数:开始日期、结束日期和间隔,其中间隔指示每一行是否应代表我提供的范围内的不同天、月或年。

例如,这个:

    myfunction("2016/01/01", "2016/04/30", "months")

会产生与此相同的东西:

    sd <- c("2016/01/01","2016/02/01","2016/03/01","2016/04/01")
    ed <- c("2016/01/31","2016/02/29","2016/03/31","2016/04/30")
    df <- data.frame(sd, ed)

还有这个:

    myfunction("2016/01/01","2016/01/05", "days")

会产生与此相同的东西:

    sd <- c("2016/01/01","2016/01/02","2016/01/03","2016/01/04","2016/01/05")
    ed <- c("2016/01/01","2016/01/02","2016/01/03","2016/01/04","2016/01/05")
    df <- data.frame(sd, ed)

这是我迄今为止尝试过的:

    range <- function(startdate, enddate, interval){
    sd <- seq(as.Date(startdate), as.Date(enddate), interval)
    ed <- seq(as.Date(startdate), as.Date(enddate), interval) -1
    df <- data.frame(sd,ed)
    return(View(df))
    }

但是无论我是运行几天还是几个月,结束日期都是错误的。见:

    range("2016/01/01","2016/01/05","days")

    range("2016/01/01","2016/04/30","months")

我如何编写代码以使我的函数始终返回正确的结束日期,无论我查看的是几天、几个月还是几年?我在这里查看了其他问题,但它们似乎都使用静态间隔而不是动态间隔。

【问题讨论】:

  • 请看seq()
  • 谢谢,我有。但是我需要该功能可以使用 1 天、30-31 天或 365 天,具体取决于。我还没有找到将动态长度合并到 seq() 本身或函数中的方法。有什么建议吗?

标签: r dataframe seq


【解决方案1】:
library(lubridate)

# Start date and end date should be of character type
# interval should be "day" or "month" or "year"

get_range <- function(startdate, enddate, interval)
 {
  start <- seq(from = as.Date(start, format = "%m/%d/%Y"),
                         to = as.Date(end, format = "%m/%d/%Y"),
                         by = interval)
  end <- start + sapply(start, function(x){ifelse(interval == "day", 0,
                    ifelse(interval == "month", 
                           days_in_month(month(x)) - day(x),
                           365))})
  return(data.frame(start,end))
 }

【讨论】:

  • 使用它而不是我已有的代码有什么好处?两者都成功地给了我一个 StartDates 列表。我的问题是在指定时间段内获得正确的 EndDates。
  • 更新后的代码应该可以满足您的需求。看看吧
  • 谢谢,但它仍然给了我不稳定的结束日期,例如。开始日期 2016/01/01 显示结束日期 2016/12/31,开始日期 2016/01/05 显示结束日期 2017/01/04。不过,这是一个很好的开始,我会搞砸它,看看能不能让它发挥作用!
  • 有趣。检查传递给函数的区间参数。如果它不是“日”或“月”,它将给出结束日期,假设间隔是一年。只需查找诸如“days”或“months”之类的拼写错误。
  • 啊哈!我一直在使用 seq() 的语法,并认为“天”与“天”无关紧要。有用!为清晰和准确起见,接受了 2 处更改的答案。
猜你喜欢
  • 2016-08-21
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多