将年月格式的日期转换为月的最后日期

时间:2019-06-24 09:55:26

标签: r datetime

我的数据集如下

7.14.1

我想为其添加,其中包含给定月份年份(每月{{1}的列),该月最后一天的日期 })

例如,月份年份7.14.1将变为dataset=data.frame(ID=c(1,2,3,4,5),MonthYear=c("May 2015","April 2015","January 2016","February 2016","December 2018"))

我尝试使用MonthYear软件包May 2015 基于我在该论坛上找到的解决方案,但似乎无效。

4 个答案:

答案 0 :(得分:3)

对于zoo,我们使用as.yearqtr而不是as.yearmon,因为格式为“月年”

library(zoo)
as.Date(as.yearmon(dataset$MonthYear), frac = 1)
#[1] "2015-05-31" "2015-04-30" "2016-01-31" "2016-02-29" "2018-12-31"

答案 1 :(得分:2)

问题是

  1. 您的格式错误。问题中显示的格式是一个缩写的月份,后面是年份,并且两者之间没有空格。实际上,数据具有完整的月份名称,后跟一个空格,然后是年份。

  2. 问题中的代码中使用了
  3. yearqtr,但这是一年和一年的四分之一,而您有一年的年和月。使用yearmon,而不是yearqtr

进行这些更改将产生以下代码

transform(dataset, eom = as.Date(as.yearmon(MonthYear, "%B %Y"), frac = 1))

给予:

  ID     MonthYear        eom
1  1      May 2015 2015-05-31
2  2    April 2015 2015-04-30
3  3  January 2016 2016-01-31
4  4 February 2016 2016-02-29
5  5 December 2018 2018-12-31

答案 2 :(得分:1)

使用lubridate,我们可以将MonthYear转换为日期对象,并将ceiling_dateunit = "Month"一起使用,并从中减去1天,以得出该月的最后一天。

library(lubridate)
ceiling_date(dmy(paste("01", dataset$MonthYear)), unit = "month") - 1
#[1] "2015-05-31" "2015-04-30" "2016-01-31" "2016-02-29" "2018-12-31"

答案 3 :(得分:1)

在基数R中,我们可以在seq上加上一个月,然后减去一天。

as.Date(mapply(function(x) seq(x, length.out=2, by="month")[2] - 1, 
               as.Date(paste("01", dataset$MonthYear), "%d %B %Y")), 
        origin="1970-01-01")
# [1] "2015-05-31" "2015-04-30" "2016-01-31" "2016-02-29" "2018-12-31"

注意: as.Date(dataset$MonthYear, "%B %Y")无法正常工作,我不知道为什么...?

数据

dataset <- structure(list(MonthYear = structure(c(5L, 1L, 4L, 3L, 2L), .Label = c("April 2015", 
"December 2018", "February 2016", "January 2016", "May 2015"), class = "factor")), class = "data.frame", row.names = c(NA, 
-5L))