[英]convert date in Month-Year format to last date of month
我的数据集看起来像这样
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
将成为31-05-2015
根据我在此论坛上找到的解决方案as.Date(as.yearqtr(MonthYear, "%b%Y"), frac = 1)
使用了我尝试使用的as.Date(as.yearqtr(MonthYear, "%b%Y"), frac = 1)
的zoo
程序包,但它似乎不起作用。
使用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"
问题是
您的格式错误。 问题中显示的格式是一个缩写的月份,后面是年份,并且两者之间没有空格。 实际上,数据具有完整的月份名称,后跟一个空格,然后是年份。
在问题的代码中使用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
使用lubridate
我们可以将MonthYear
转换为date对象,并使用ceiling_date
和unit = "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"
在基数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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.