【问题标题】:How to convert decimal date format (e.g. 2011.580) to normal date format?如何将十进制日期格式(例如 2011.580)转换为普通日期格式?
【发布时间】:2015-04-17 11:04:39
【问题描述】:

我正在尝试从十进制日期格式(从 changepoint 包返回 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 月(我不确切知道它们,我是从图表中读取的)。

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

谁能帮帮我?

谢谢

【问题讨论】:

    标签: r date-formatting


    【解决方案1】:

    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"
    

    【讨论】:

      【解决方案2】:
      > 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 日。

      【讨论】:

      • 你说得对,这个方法不处理一月一号 - 只要一月一号它就返回NA
      【解决方案3】:

      对于那些考虑使用基本 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 日。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-17
        • 2018-05-17
        • 2014-02-25
        • 2018-05-05
        • 1970-01-01
        • 2015-02-28
        • 1970-01-01
        • 2020-03-04
        相关资源
        最近更新 更多