我试图从小数日期格式(从变更点包中返回cpts.ts()的类型)更改为正常日期格式%Y-%m-%d。例如:
cpts.ts(myTimeSeries.BinSeg)
[1] 2001.667 2004.083 2008.750 2011.583 2011.917
实际日期是2001年8月,2004年1月,2008年9月,2011年6月/ 7月和2011年12月的某个时间(我不完全了解它们,我正在从图表中读取它们)。
我似乎无法找到将此格式转换回通常日期格式的标准方法。
有人能帮助我吗?
谢谢
答案 0 :(得分:7)
lubridate
的结果略有不同:
library(lubridate)
decimals <- c(2001.667, 2004.083, 2008.750, 2011.583, 2011.917)
format(date_decimal(decimals), "%Y-%m-%d")
# [1] "2001-09-01" "2004-01-31" "2008-10-01" "2011-08-01" "2011-12-01"
答案 1 :(得分:4)
> foo <- c(2001.667,2004.083,2008.750,2011.583,2011.917)
> as.Date(paste(trunc(foo),round((foo-trunc(foo))*365,0)),"%Y %j")
[1] "2001-08-31" "2004-01-30" "2008-09-30" "2011-08-01" "2011-12-01"
查看?as.Date
及其format
参数,该参数会引导您?strptime
,我从中获取%j
格式规范。
您可能需要适应某些角落情况,例如1月1日。
答案 2 :(得分:4)
对于那些考虑基本R解决方案的人来说,lubridate date_decimal
的核心基本上是:
start <- as.POSIXct(paste0(trunc(foo), "/01/01"), tz="UTC")
end <- as.POSIXct(paste0(trunc(foo)+1,"/01/01"), tz="UTC")
start + (difftime(end, start, units="secs") * (foo - trunc(foo)))
即。 - 在日期出现的年份开始时设置start
日期,在下一年开始时设置end
日期,将开始和结束之间的差值乘以年过去了,将这个差异添加回去。这样做会考虑到闰年,并且适用于1月1日。