手动计算日期之间的天数

时间:2016-05-29 18:17:18

标签: r date datetime

我怀疑R有一个内置的方法可以做到这一点,但我是编程的新手,并试图弄清楚如何手动计算日期之间的日期作为练习。这是我的代码:

isLeapYear <- function(year) {
  if (year %% 400 == 0) {
    return (TRUE)
  }
  if (year %% 100 == 0) {
    return (FALSE)
  }
  if (year %% 4 == 0) {
    return (TRUE)
  }
  else{ return (FALSE)}
}

daysInMonth <- function(year,month){
  if (month == 1 | month == 3| month == 5 | month == 7 | month == 8 | month == 10 | month == 12) {
    return (31)
  }
  else if (month == 2){
    if (isLeapYear(year)){
      return (29)
    }
    else {return (28)}
  }
  else {return (30)}
}
nextDay <- function(year, month, day){
  if (day < daysInMonth(year,month)){
    return (list(year, month, day + 1))
  }
  else{
    if (month == 12){
      return (list(year + 1, 1, 1))
    }
    else{return (list(year, month + 1, 1))}
  }
}

dateIsBefore <- function(year1, month1, day1, year2, month2, day2){
  if (year1 < year2){
    return(TRUE)
  }
  if (year1 == year2){
    if (month1 < month2){
      return(TRUE)
    }
    if (month1 == month2){
      return (day1 < day2)
    }
  }
  return (FALSE)
}

daysBetweenDates <- function(year1, month1, day1, year2, month2, day2){
  days <- 0
  while (dateIsBefore(year1, month1, day1, year2, month2, day2)){
    result = nextDay(year1,month1,day1)
    year1 = result[1]
    month1 = result[2]
    day1 = result[3]
    days = days+1
  }
  return (days)
}

我编写了一个代码来确定使用python的两个日期之间的天数。我现在正试图将其转换为R,以便我做其他任务。当我运行每个单独的功能时,它们似乎工作正常。当我致电daysBetweenDates(2012,1,1,2012,2,28)时,我收到以下错误:

  

日期错误+ 1:二元运算符的非数字参数

2 个答案:

答案 0 :(得分:2)

 > as.Date("2012/02/28") - as.Date("2012/01/01")
 # Time difference of 58 days
 > as.Date("2012/01/01") - as.Date("2012/02/28")
 # Time difference of -58 days

Dirk在评论中提出的改进只是为了使用as.integer()将数字作为差异,这里是

 > as.integer(as.Date("2012/02/28") - as.Date("2012/01/01"))
 # [1] 58
 > as.integer(as.Date("2012/01/01") - as.Date("2012/02/28"))
 # [1] -58

答案 1 :(得分:1)

您的代码无效的原因是因为您将result的三个元素分配给year1month1day1 {您while函数中的{1}}循环。如果你改变它,它应该工作:

daysBetweenDates

如果您执行daysBetweenDates <- function(year1, month1, day1, year2, month2, day2){ days <- 0 while (dateIsBefore(year1, month1, day1, year2, month2, day2)){ result = nextDay(year1,month1,day1) year1 = result[[1]] month1 = result[[2]] day1 = result[[3]] days = days + 1 } return (days) } 然后return <- list(2012, 1, 1)并将其与return[1]进行比较,则应该看到差异。这是使用列表时常见的错误。您可能需要查看此内容,以便对子集化进行出色的讨论:http://adv-r.had.co.nz/Subsetting.html