租金日月功能

时间:2017-05-18 17:08:50

标签: r date lubridate

我正在尝试创建一个可以计算一个月内租金的R函数。它将作为参数:start_date,end_date,当前月份。并返回月份租金天数的整数输出。 (这将用于公寓租赁模式)。

例如,

library(lubridate)

start_date <- ymd('2017-06-15')
end_date <- ymd('2018-06-14')
current_month <- ymd('2017-06-01')

rent_days_in_month(start_date, end_date, current_month)
[1] 16

我有一个我认为有效的功能,但它似乎过于复杂。我也想确保它可以进行矢量化,这样我就可以在mutate的数据框上应用。

这是我的功能:

rent_days_in_month <- function(start_date,
                               end_date, 
                               current_month){

  last_day_in_month <- ceiling_date(current_month,
                                    unit = "months") - 1

  current_month_days_in_moth <- days_in_month(current_month)

  first_day_in_month <- floor_date(current_month,
                                   unit = "month")

  if (last_day_in_month < start_date) {

    rent_days_in_month <- 0 

    return(rent_days_in_month)

  }

  rent_days_in_month <- as.numeric(end_date - start_date + 1)

  rent_days_in_month <- min(rent_days_in_month, 
                            current_month_days_in_moth)


  if (end_date < last_day_in_month){

    if (end_date > first_day_in_month){

      if (start_date  > first_day_in_month) {

        rent_days_in_month <- end_date - start_date - 1

        return(rent_days_in_month)

      } else {

        rent_days_in_month <- end_date - first_day_in_month

        return(rent_days_in_month)
      } 

    } else {

      rent_days_in_month <- 0 

      return(rent_days_in_month)

    }

  }

  return(rent_days_in_month)

}

然后我尝试将它像这样进行矢量化:

v_rent_days_in_month <- Vectorize(rent_days_in_month)

那里有什么比这更简单的工作吗?另外,想知道这是否正确使用了Vectorize函数。

由于

2 个答案:

答案 0 :(得分:0)

library(lubridate)
start_date <- as.Date('2017-06-15')
end_date <- as.Date('2018-06-14')
days <- seq(start_date, end_date, by= 'days')
lapply(split(days, month(days)), length)

使用seq函数和参数by ='days'来获取所有那些日期的向量。然后按月和总和分成一个列表。

答案 1 :(得分:0)

library(lubridate)
start_date <- as.Date("2017-06-15")
end_date <- as.Date("2018-06-14")
current_month<- as.Date("2017-06-01")

rent_days_in_month = function(start_date, end_date, current_month){
  if(month(current_month) == month(start_date) & year(current_month) == year(start_date)){
    return(as.numeric(difftime(ceiling_date(start_date, "month"), start_date, units = c("days"))))
  }else if(current_month < floor_date(start_date, "month") | current_month >= ceiling_date(end_date)){
    return("invalid date")
  }else if(month(current_month) == month(end_date) & year(current_month) == year(end_date)){
    return(as.numeric(difftime(end_date, current_month, units = c("days"))) + 1)
  }else{
    tmp = ceiling_date(current_month, "month") - 1
    return(day(tmp))
  }

}

> rent_days_in_month(start_date, end_date, current_month)
[1] 16

> rent_days_in_month(start_date, end_date, as.Date("2015-01-01"))
[1] "invalid date"

> rent_days_in_month(start_date, end_date, as.Date("2018-01-01"))
[1] 31

> rent_days_in_month(start_date, end_date, as.Date("2018-06-01"))
[1] 14