R - strtoi奇怪的行为,以获得一年中的一周

pal*_*czy 5 format r date

strtoi用以确定以下函数中的一周中的一周:

to.week <- function(x) strtoi(format(x, "%W"))
Run Code Online (Sandbox Code Playgroud)

它适用于大多数日期:

> to.week(as.Date("2015-01-11"))
[1] 1
Run Code Online (Sandbox Code Playgroud)

但是,当我在2015-02-23和之间尝试日期时2015-03-08,我得到NA的结果是:

> to.week(as.Date("2015-02-25"))
[1] NA
Run Code Online (Sandbox Code Playgroud)

能否请您解释一下导致问题的原因?

Bro*_*ieG 6

这是一个有效的实现:

to.week <- function(x) as.integer(format(x, "%W"))
Run Code Online (Sandbox Code Playgroud)

strtoi失败的原因是默认情况下,当它们以a开头时,它会尝试将数字解释为八进制"0".由于"%W"返回"08",并且八进制中不存在8,因此获得NA.来自?strtoi:

使用C函数strtol根据给定的基础将字符串转换为整数,或者根据C规则选择合适的基数.

...

对于十进制字符串as.integer同样有用.

此外,您可以使用:

week(as.Date("2015-02-25"))
Run Code Online (Sandbox Code Playgroud)

虽然您可能必须将其结果抵消1以符合您的期望.

  • 你的解释对我来说似乎不完整.事实上,format.Date的结果中存在一个导致问题的前导"0".`format(as.Date("2010-02-26"),"%W")[1]"08"`.函数`strtoi`不将"10"解释为小数8. (2认同)

Mam*_*zal 5

你可以像这样稍微修改你的代码

to.week <- function(x) strtoi(format(x, "%W"), 10)
Run Code Online (Sandbox Code Playgroud)

并使用基数 10。