gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:57:14 24 4
gpt4 key购买 nike

我正在将一年中的某一天转换为日期,我注意到 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')

返回错误: Error in charToDate(x) :
character string is not in a standard unambiguous format

最佳答案

我试图通过查看各种 methods 的定义来部分回答以下问题。下S3 generic as.Date ,以及通过 RStudio 调试代码并查看调用函数的历史记录。
as.Date.numeric 的定义, as.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')

}

在第一次通话中, UseMethodas.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。在 as.Date.character 内部定义而不是 strptime作为条件 if missing(format)是真的。在这种情况下, charToDate尝试默认格式并在 '%Y-%m-%d 中找到匹配项.在这种情况下, strptime提供正确的格式并计算正确的值 2015-01-01 .现在已添加到 x ,即 1 - 记住字符版本是由代码为 as.Date(origin, ...) + x 的数字版本调用的.这提供了正确的答案。

虽然它没有为您的问题提供完整的答案,但一般的学习是它严重依赖于传递给 strptime 的格式字符串。 .希望这可以帮助。

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

as.Date.character
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)
}

as.Date.default
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)
}

关于r - 在 R 中寻求 as.Date() 函数的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50988018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com