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