POSIX日期为每周时间格式的日期

时间:2017-01-11 17:57:49

标签: r date posix

我的日期以每周时间格式编码(欧洲会议>> 0152 / 53,例如"2016-48"),并希望将它们标准化到POSIX日期:

require(magrittr)
(x <- as.POSIXct("2016-12-01") %>% format("%Y-%V"))
# [1] "2016-48"
as.POSIXct(x, format = "%Y-%V")
# [1] "2016-01-11 CET"

我希望最后一句话再次返回"2016-12-01"。我在这里缺少什么?

修改

感谢Dirk,我能够把它拼凑起来:

y <- sprintf("%s-1", x)

虽然我仍然不知道为什么这不起作用

(as.POSIXct(y, format = "%Y-%V-%u"))
# [1] "2016-01-11 CET"

这样做

(as.POSIXct(y, format = "%Y-%U-%u")
# [1] "2016-11-28 CET"

编辑2

哦,我认为使用%V一般是非常坏主意:

as.POSIXct("2016-01-01") %>% format("%Y-%V")
# [1] "2016-53"

是否应该将其视为需要采取进一步措施的“严重错误”级别?!

坚持%U%W似乎是正确的方法

as.POSIXct("2016-01-01") %>% format("%Y-%U")
# [1] "2016-00"

编辑3

没有,还没完成/仍然困惑:这种方法在第一周不起作用

(x <- as.POSIXct("2016-01-01") %>% format("%Y-%W"))
# [1] "2016-00"

as.POSIXct(sprintf("%s-1", x), format = "%Y-%W-%u")
# [1] NA

当使用01%U(实际上是“第2周”)时,它会在基础约定中定义的第%W

as.POSIXct("2016-01-1", format = "%Y-%W-%u")
# [1] "2016-01-04 CET"

1 个答案:

答案 0 :(得分:1)

由于我必须处理ISO周报告,我几年前创建了ISOweek package

该软件包包含函数Canvas,其中返回给定周日的日期(年份,一年中的一周,根据ISO 8601的星期几)。它是Canvas的反函数。

使用ISOweek2date(),您的示例将变为:

date2ISOweek()
ISOweek
library(ISOweek)

# define dates to convert
dates <- as.Date(c("2016-12-01", "2016-01-01"))

# convert to full ISO 8601 week-based date yyyy-Www-d
(week_dates <- date2ISOweek(dates))
[1] "2016-W48-4" "2015-W53-5"

请注意,# convert back to class Date ISOweek2date(week_dates) 要求格式为[1] "2016-12-01" "2016-01-01" 的完整ISO week-based date,包括星期几(1到7,星期一到星期日)。

因此,如果您只有年份和ISO周数,则必须创建一个包含指定星期几的字符串。

许多报告中的典型词组是,例如“报告第31周结束2017-08-06 ”:h

date2ISOweek()
yyyy-Www-d

附录

请参阅this answer了解有关yr <- 2017 wk <- 31 ISOweek2date(sprintf("%4i-W%02i-%1i", yr, wk, 7)) 包的其他用例和更多背景信息。