gpt4 book ai didi

r - as.Date在以周为基础的日期序列中产生意外结果

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

我正在研究将基于星期的日期转换成基于月的日期的方法。

检查我的工作时,我在数据中发现以下问题,这是对as.Date()的简单调用导致的

as.Date("2016-50-4", format = "%Y-%U-%u")
as.Date("2016-50-5", format = "%Y-%U-%u")
as.Date("2016-50-6", format = "%Y-%U-%u")
as.Date("2016-50-7", format = "%Y-%U-%u") # this is the problem

前面的代码为前3行产生正确的日期:
"2016-12-15"
"2016-12-16"
"2016-12-17"

但是,最后一行代码可以追溯到1周:
 "2016-12-11"

有人可以解释这里发生了什么吗?

最佳答案

在一年中的一周工作可能会变得非常棘手。您可以尝试使用ISOweek包转换日期:

# create date strings in the format given by the OP
wd <- c("2016-50-4","2016-50-5","2016-50-6","2016-50-7", "2016-51-1", "2016-52-7")
# convert to "normal" dates
ISOweek::ISOweek2date(stringr::str_replace(wd, "-", "-W"))

结果
#[1] "2016-12-15" "2016-12-16" "2016-12-17" "2016-12-18" "2016-12-19" "2017-01-01"

属于 Date类。

请注意,基于ISO周的日期格式为 yyyy-Www-d,其大写 W在周号之前。要将其与标准的基于月的日期格式 yyyy-mm-dd区别开来是必需的。

因此,为了使用 ISOweek2date()转换OP提供的日期字符串,有必要在第一个连字符后插入 W,这是通过在每个字符串中用 -替换第一个 -W来实现的。

另请注意,ISO周从星期一开始,并且星期几从1到7编号。属于ISO周的年份可能与日历年有所不同。从上面的示例日期可以看出这一点,在该示例日期中,基于星期的日期 2016-W52-7转换为 2017-01-01

关于 ISOweek

早在2011年,Windows版本的R中的 %G尚未提供 %g%u%Vstrptime()格式规范。这很烦人,因为我必须准备每周报告,包括每周比较。我花了几个小时找到解决ISO周,ISO工作日和ISO年的解决方案。最后,我最终创建了 ISOweek包并发布了 on CRAN。如今,该软件包仍然具有其优点,因为在输入时将忽略上述格式(有关详细信息,请参见 ?strptime)。

关于r - as.Date在以周为基础的日期序列中产生意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41724427/

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