当前位置: 首页 > 知识库问答 >
问题:

手动计算日期之间的天数

亢奇
2023-03-14

我怀疑 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个答案

左丘嘉言
2023-03-14

代码不起作用的原因是您在 daysBetweenDates 函数的 while 循环中将结果的三个元素分配给 year1month1day1 的方式。如果你像这样改变它,它应该可以工作:

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)
}

如果您< code >返回

巫马俊力
2023-03-14
 > 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
 类似资料:
  • 问题内容: 在我的代码中,日期之间的差异是错误的,因为它应该是38天而不是8天。我该如何解决? 问题答案: 问题出在变量中。月以Capital M表示。 尝试更改为: 有关更多信息,请参见此javadoc。 编辑: 这是代码,如果您想以注释的方式打印差异: 希望对您有所帮助!

  • 问题内容: 我编写了以下代码来查找两个日期之间的日期 当开始日期和结束日期分别是2/3/2017和3/3/2017时,显示的天数是29.尽管它们是同一天,但显示的是1.(请假的天数。如果请假一天,他必须选择相同的开始日期和结束日期。因此,在这种情况下,他请了两天假。 我究竟做错了什么?感谢您的时间。 注意:请不要使用日期构造函数。检查下面接受的答案。使用simpledateformat或Joda时

  • 我写了以下代码来查找两个日期之间的日期 当开始日期和结束日期分别为2017年2月3日和2017年3月3日时,显示的天数为29天。虽然当他们在同一天,它是显示1。(一个人休假的天数。因此,如果一个人休假一天,他必须选择相同的开始和结束日期。因此,在这种情况下,他休假两天)。 我做错了什么?谢谢你抽出时间。 注意:请不要使用日期构造函数。检查下面被接受的答案。使用simpledateformat或Jo

  • 问题内容: 我正在计算从“开始”到“结束”日期之间的天数。例如,如果起始日期为2010年4月13日,起始日期为2010年5月15日,则结果应为 如何使用JavaScript获得结果? 问题答案:

  • 问题内容: 我有两个输入日期来自Date Picker控件。我选择了开始日期2/2/2012和结束日期2/7/2012。我为此编写了以下代码。 我应该得到6的结果,但是我却得到5。 谁能告诉我如何获得确切的区别? 问题答案: 从Moment文档: 或包含起点: 避免手动打乱时间戳和时区。 根据您的特定用例,您可以 使用和/或强制diff在“端点”处包含或排除(如@kotpal在评论中所建议)。 设

  • 我的数据如下: 我想计算每个组每年日期之间的平均天数。我尝试了以下代码,但收到以下错误: 我的日期列的类别是日期。