如何将十进制日期格式(例如2011.580)转换为正常日期格式?

时间:2015-04-17 11:04:39

标签: r date-formatting

我试图从小数日期格式(从变更点包中返回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月的某个时间(我不完全了解它们,我正在从图表中读取它们)。

我似乎无法找到将此格式转换回通常日期格式的标准方法。

有人能帮助我吗?

谢谢

3 个答案:

答案 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日。