[英]R How to convert decimal numeric(year.month) to date format
我的數據具有十進制數字格式的日期信息,這使得 October 子集為 Jan.(010=>1) 因此,as.POSIXct 和 as.Date 不適用。 當使用 substring(或 substr) 取最后兩位時,它會自動轉換為字符,然后 010 變為 1。
num<-c(2019.009, 2019.010,2019.011)
Y<-as.numeric(substring(num,1,4))
M<-as.numeric(substr(num, 7,8))
as.yearmon(paste(Y,M),"%Y %m")
[1] "Sep 2019" "Jan 2019" "Nov 2019"
as.POSIXct(num, tx="GMT","%Y %m")
Error in as.POSIXct.numeric(num, tx = "GMT", "%Y %m") :
'origin' must be supplied
as.Date(num, "%Y %m")
Error in charToDate(x) :
character string is not in a standard unambiguous format
在 base R 中,您可以使用strptime/as.Date
+ strftime/format
等函數。
方法一:
strftime(strptime(sprintf("%.3f01",num),"%Y.0%m%d"),"%b %Y")
[1] "Sep 2019" "Oct 2019" "Nov 2019"
方法二:
format(as.Date(sprintf("%.3f01",num),"%Y.0%m%d"),"%b %Y")
[1] "Sep 2019" "Oct 2019" "Nov 2019"
當然你可以混合使用這些功能,例如strptime
+ format
等
如果您使用的是zoo
圖書館,您可以這樣做:
zoo::as.yearmon(sprintf("%.3f", num), "%Y.0%m")
[1] "Sep 2019" "Oct 2019" "Nov 2019"
您可以使用sprintf
獲得固定的小數位數,並使用sub
提取數據中的前 4 位數字和后 2 位數字並轉換為年月 class。
num<-c(2019.009, 2019.010,2019.011)
zoo::as.yearmon(sub('(\\d{4})\\..(\\d{2})$', '\\1-\\2', sprintf('%0.3f', num)))
#[1] "Sep 2019" "Oct 2019" "Nov 2019"
使用sprintf
后,您的原始代碼也可以使用:
num <- sprintf('%0.3f', num)
Y<-as.numeric(substring(num,1,4))
M<-as.numeric(substr(num, 7,8))
zoo::as.yearmon(paste(Y,M),"%Y %m")
#[1] "Sep 2019" "Oct 2019" "Nov 2019"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.