具有month(integer)和year(integer)的矩阵,我希望使用R以Date或POSIX格式提取它

时间:2018-07-11 09:06:21

标签: r date posixct

我创建了一个功能来到达月份,因此,如果在一个月的15号之前创建了发票,则将考虑上个月。否则它将考虑当月。输出以矩阵形式存储(2列4500行)。一列表示整数的月份,而另一列表示整数的年份。程序和输出如下。我希望月份和年份采用日期格式,而不是整数,这样我就可以在可视化数据中滑动和切块数据。感谢您的帮助。

# If the date is before 15th of a month, will consider previous month. Else current month
myDateFun <- function(x){
      x <- as.Date(x, format='%d-%m-%Y')
      if (day(x) < 15){
        dd <- x-14 
      }
      else {dd <- x}
      return(c(month(dd), year(dd)))
    }

    # sapply method used to absorb the function and create matrix of month and year
mat = t(sapply(CI3$invoice_date, FUN=myDateFun, simplify='matrix'))

# Output [,1] is month. [,2] is year   
mat
            [,1] [,2]
       [1,]    3 2016
       [2,]    4 2016
       [3,]    5 2016
       [4,]    6 2016

3 个答案:

答案 0 :(得分:0)

如果您稍微调整功能,则无需使用sapply。

myDateFun <- function(x){
  x <- as.Date(x, format='%d-%m-%Y')
  ifelse(lubridate::day(x) < 15, dd <- x-14, dd <- x)
  out <- format(dd, "%Y-%m")
  return(out)
}

# add year month to CI3
# year_month will be a character vector due to format function.
CI3$year_month <- myDateFun(CI3$invoice_date)

基于评论的编辑:

我编辑了该函数,以便可以使用一个额外的参数来指定年份或月份。默认值为年份。非常简单的错误处理,以确保它是这些值之一。

myDateFun <- function(x, period = "year"){
  # error handling
  if(!(period %in% c("year", "month"))) stop("period should be year or month")

  x <- as.Date(x, format='%d-%m-%Y')
  ifelse(lubridate::day(x) < 15, dd <- x-14, dd <- x)
  if(period == "year"){
  out <- format(dd, "%Y")
  } else {
    out <- format(dd, "%b")
  }
  return(out)
}


CI3$year <- myDateFun(CI3$invoice_date, "year")
CI3$month <- myDateFun(CI3$invoice_date, "month")

答案 1 :(得分:0)

这里是使用lubridate和purrr软件包的解决方案。我通常只需要日期的月份和年份,因此我只将日期默认设置为1并忽略它。

以下是您格式的一些示例数据:

    library(tidyverse)
    library(lubridate)

     x <- data_frame(date = c("03/01/2018", "01/02/2015", "03/04/2006", "25/12/2006", "15/01/2014"))

这是使用lubridate的功能:

    AltDateFun <- function(x) {
        x <- dmy(x)
        if (day(x) < 15) {
            x <- x - months(1)
            day(x) <- 1
            return(x)
        }
        else {
            day(x) <-1
            return(x)
        }
    }

并假设您的发票日期是数据框中的字符列,日期的格式为dmy:

    z <- map_df(x, AltDateFun)

    # A tibble: 5 x 1
    x         
    <date>    
    1 2017-12-01
    2 2015-01-01
    3 2006-03-01
    4 2006-11-01
    5 2013-12-01

编辑:

要在单独的列中获取月份和年份,请执行以下操作:

    z %>% mutate(m = month(x), y = year(x))

    # A tibble: 5 x 3
    x              m     y
    <date>     <dbl> <dbl>
    1 2017-12-01 12.0   2017
    2 2015-01-01 1.00   2015
    3 2006-03-01 3.00   2006
    4 2006-11-01 11.0   2006
    5 2013-12-01 12.0   2013

答案 2 :(得分:0)

有效。谢谢大家的回答。只是分享我使用的代码。下面更新了代码

myDateFun <- function(x, period = "year") {
  # error handling
  if (!(period %in% c("year", "month")))
    stop("period should be year or month")

  x <- as.Date(x, format = '%d-%m-%Y')
  ifelse(lubridate::day(x) < 15, dd <- x - 14, dd <- x)
  if (period == "year") {
    out <- format(dd, "%Y")
  } else {
    out <- format(dd, "%b")
  }
  return(out)
}

CI3$invyr <- myDateFun(CI3$invoice_date, "year")
CI3$invmon <- myDateFun(CI3$invoice_date, "month")
CI3$date_m_Y = paste(CI3$invmon, CI3$invyr, sep = "-")