寻求解释R中的as.Date()函数

时间:2018-06-22 12:31:40

标签: r

我将每年的日期转换为日期,并且我注意到stage1PlayerSaved.health = 80; stage1PlayerSaved.position = 50.3f; stage1PlayerSaved.color = Color.Green; 通常会返回意外的结果(对我来说)。为什么对这些命令会得到不同的答案?

as.Date

返回as.Date(x = 1, format = '%j', origin= '2015-01-01')

"2018-07-21"

返回as.Date(x = 1, origin= '2015-01-01')

"2015-01-02"

返回as.Date(x = 1, format = '%j', origin= as.Date('2015-01-01'))

"2015-01-02"

返回as.Date(x = '1',format = '%j', origin= '2015-01-01')

"2018-01-01"

返回错误:as.Date(x = '1', origin= '2015-01-01')

1 个答案:

答案 0 :(得分:2)

我尝试通过查看methods下各种S3 generic as.Date的定义,以及通过RStudio调试代码并查看称为函数的历史来部分回答以下问题

答案的底部提供了as.Date.numericas.Date.characteras.Date.default的定义。

我定义了自己的函数check来调试发生的情况。

check <- function() {

as.Date(x =  1, format = '%j', origin= '2015-01-01')
as.Date(x = 1, origin= '2015-01-01')

}

在第一个调用中,UseMethod中的as.Date被调用,并将其分派到as.Date.numeric。依次调用as.Date(origin, ...),现在将其分派到as.Date.character。如果您查看as.Date.character的源代码,则条件if missing(format)为FALSE,因为在这种情况下已提供了格式%j。因此,被调用的代码段是strptime(x, format, tz = "GMT")。这将返回2018-07-20 IST,最后一次调用2018-07-20会将其转换为as.Date。请注意,时区可能因您所在的国家/地区而异。strptime内部调用C函数,该函数无法使用此过程进行调试。

在第二个调用中,主要区别在于用户未提供格式字符串。因此,按照上面相同的过程,由于条件charToDate为TRUE,因此调用的是在as.Date.character内部而不是strptime内部定义的函数if missing(format)。在这种情况下,charToDate尝试使用默认格式并在'%Y-%m-%d中找到匹配项。在这种情况下,将为strptime提供 correct 格式,并计算正确的值2015-01-01。现在将其添加到x中,该数字为1-记住字符版本是由代码为as.Date(origin, ...) + x的数字版本调用的。这提供了正确答案。

虽然它不能完全回答您的问题,但通常的学习是它在很大程度上取决于传递给strptime的格式字符串。希望这会有所帮助。

日期数字

function (x, origin, ...)
{
  if (missing(origin))
    stop("'origin' must be supplied")
  as.Date(origin, ...) + x
}

日期字符

function (x, format, tryFormats = c("%Y-%m-%d", "%Y/%m/%d"),
          optional = FALSE, ...)
{
  charToDate <- function(x) {
    xx <- x[1L]
    if (is.na(xx)) {
      j <- 1L
      while (is.na(xx) && (j <- j + 1L) <= length(x)) xx <- x[j]
      if (is.na(xx))
        f <- "%Y-%m-%d"
    }
    if (is.na(xx))
      strptime(x, f)
    else {
      for (ff in tryFormats) if (!is.na(strptime(xx, ff,
                                                 tz = "GMT")))
        return(strptime(x, ff))
      if (optional)
        as.Date.character(rep.int(NA_character_, length(x)),
                          "%Y-%m-%d")
      else stop("character string is not in a standard unambiguous format")
    }
  }
  res <- if (missing(format))
    charToDate(x)
  else strptime(x, format, tz = "GMT")
  as.Date(res)
}

默认日期

function (x, ...)
{
  if (inherits(x, "Date"))
    x
  else if (is.logical(x) && all(is.na(x)))
    .Date(as.numeric(x))
  else stop(gettextf("do not know how to convert '%s' to class %s",
                     deparse(substitute(x)), dQuote("Date")), domain = NA)
}