我创建了一个功能来到达月份,因此,如果在一个月的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
答案 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 = "-")