2016-05-29 3 views
0

Я подозреваю, что у 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) я получаю следующее сообщение об ошибке:

Error in day + 1 : non-numeric argument to binary operator

+0

Все, что вам действительно нужно, это '-', например. 'as.Date ('2015-01-01') - as.Date ('2013-01-01')' – alistaire

+0

Я понял, что у r есть встроенный метод для этого, но я новичок в программировании и пытался как практика. –

ответ

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 
+2

Правильно, и если вы произвели результат, например, через 'as.integer()', вы также получите только числовой ответ. –

1

Причина ваш код не работает из-за того, как вы назначаете три элемента из result в year1, month1 и day1 в цикле while в y наш 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] и сравните это с return[[1]] вы должны увидеть разницу. Это обычная ошибка при использовании списков. Вы можете взглянуть на это для отличного обсуждения подмножества: http://adv-r.had.co.nz/Subsetting.html.

Смежные вопросы