簡體   English   中英

R 如何將十進制數字(年.月)轉換為日期格式

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

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