簡體   English   中英

將年月格式的日期轉換為月的最后日期

[英]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"

問題是

  1. 您的格式錯誤。 問題中顯示的格式是一個縮寫的月份,后面是年份,並且兩者之間沒有空格。 實際上,數據具有完整的月份名稱,后跟一個空格,然后是年份。

  2. 在問題的代碼中使用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_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"

在基數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM