【问题标题】:R set default origin for as.DateR为as.Date设置默认原点
【发布时间】:2018-01-13 16:00:27
【问题描述】:

有没有办法为 as.Date 设置默认原点? 我做了这个功能来解决:

as.date=function(x, origin='1970-01-01') as.Date(x, origin=origin)

例如:

as.Date(0)
Error in as.Date.numeric(0) : 'origin' deve ser especificado

as.date(0)
[1] "1970-01-01"

【问题讨论】:

    标签: r as.date


    【解决方案1】:

    zoo包添加了一个默认的原点:

    library(zoo)
    
    as.Date(0)
    ## [1] "1970-01-01"
    

    【讨论】:

    • 我不知道我是不是很讨厌,但我避免为小事加载包。
    • @xm1,这是完全合理的,但这也意味着你错过了一些小事情,比如日期的默认来源。当然,您可以查看zoo 包是如何做到的并复制它。
    • @GregorThomas,我已经完成了我的as.date=function(x) as.Date(x,origin='1970-01-01')
    【解决方案2】:

    有一个优雅而简单的解决方案,例如 zoo,但如果需要,可以进行一些调整:

    require(anytime)

    基础很简单:

    anytime(0) 在东部标准时间返回给我:[1] "1969-12-31 19:00:00 EST"

    如果您希望能够将其强制到时空宇宙的 UTC 中心

    anytime(0, asUTC=TRUE)

    返回

    [1] "1970-01-01 UTC"

    如果你想告诉 R 你的数据来自给定的时区:

    Sys.setenv(TZ= 'desiredTimeZone') 和 anytime:::getTZ() 作为您想要的时区,如果这是收集您的日期的那个时区。

    任何答案都可以,这个答案只是让您可以控制数字的整数(或字符串)以及时区......因此,如果您正在处理远程收集的数据,它非常普遍有用。

    【讨论】:

      【解决方案3】:

      不是真的。无法更改 origin 日期并在会话中永远保持适用。

      如果您查看as.Date 的参数(即函数,那么当x 在numeric 中时origin 没有默认值。

      ## S3 method for class 'numeric'
      as.Date(x, origin, ...)
      

      也许,为origin 提供default 值可能是对as.Date 函数的一个很好的扩展。

      OP 已经写了一些东西来创建一个包装函数来消除对origin 的依赖。也许功能可以稍微改进一下:

      根据@sm1 和@Gregor 的建议修改函数。

      ## if date.origin is not defined then origin will be taken as "1970-01-01
      options(date.origin = "1970-01-01")
      as.date <- function(x, origin = getOption("date.origin")){
        origin <- ifelse(is.null(origin), "1970-01-01", origin)
        as.Date(x, origin)
      }
      
      ## Results: (When date.origin is not set)
      ## > as.date(0)
      ## [1] "1970-01-01"
      ## > as.date(2)
      ## [1] "1970-01-03"
      ## Results: (When date.origin is set)
      ## > options(date.origin = "1970-01-05")
      ## > as.date(2)
      ## [1] "1970-01-07"
      

      【讨论】:

      • as.date &lt;- function(x, origin = ORIGIN) 会不会更容易?
      • @xm1 这很好。但是我们考虑了一个没有定义ORIGIN 的情况。在这种情况下,函数不应崩溃或返回错误。
      • 设置/获取选项可能比在全局环境中使用某些东西更好。
      • @Gregor 好建议。我正要处理 ORIGIN 未定义但似乎 option 是更好的选择时的案例。
      【解决方案4】:

      lubridate 包已专门使处理日期更容易:

      library(lubridate)
      as_date(0)
      #[1] "1970-01-01"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-25
        • 1970-01-01
        • 2014-12-03
        相关资源
        最近更新 更多