2016-11-28 5 views
0

Я работаю над функцией для создания двух столбца df, содержащего StartDate & EndDate. Я поставлю три параметра: startdate, enddate, &, где интервал указывает, должны ли каждая строка представлять разные дни, месяцы или годы в пределах диапазона, который я предоставляю.Функция для точной даты окончания на основе заданного интервала

Например, это:

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

Как я могу код так, что моя функция последовательно возвращает правильный дату конца, независимо от того, правильно ли я смотреть на дни, месяцы или годы? Я рассмотрел другие вопросы здесь, но все они, похоже, используют статические интервалы, а не динамические.

+0

Пожалуйста, взгляните на 'seq()' – Uwe

+0

Спасибо, у меня есть. Но мне понадобится функция, чтобы выйти 1 день, 30-31 дней или 365 дней, в зависимости. Я не нашел способ включить динамические длины в seq() или функцию. Какие-либо предложения? – jesstme

ответ

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

Какая польза от использования этого вместо кода, который у меня уже есть? Оба успешно дают мне список StartDates. Моя проблема заключается в получении правильного EndDates за указанный период. – jesstme

+0

Обновленный код должен делать то, что вам нужно. Проверьте это –

+0

Спасибо, но он все равно дает мне короткие даты, например. дата начала 2016/01/01 показывает дату окончания 2016/12/31, а дата начала 2016/01/05 показывает дату окончания 2017/01/04. Это отличное начало, хотя я буду возиться с ним и посмотреть, смогу ли я заставить его работать! – jesstme