我怀疑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:二元运算符的非数字参数
答案 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
的三个元素分配给year1
,month1
和day1
{您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。