POSIX date from dates in weekly 时间格式

POSIX date from dates in weekly time format

我将日期编码为每周时间格式(欧洲公约 >> 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"

我希望最后的陈述再次 return "2016-12-01"。我在这里错过了什么?


编辑

多亏了德克,我才能够拼凑起来:

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"

这是否应该被视为处于需要采取进一步行动的 "serious bug" 水平?!

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

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

编辑 3

不,不完全 finished/still 困惑:该方法在第一周就不起作用

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

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

当使用 %U%W 时,它会持续 0101(所以 "week 2",实际上)

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

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

该软件包包含函数 ISOweek2date(),其中 returns 给定星期日期(根据 ISO 8601 的年份、一年中的星期、星期几)的日期。它是 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"

请注意,date2ISOweek() 需要格式为 yyyy-Www-d 的完整 ISO week-based date,包括星期几(1 到 7,周一到周日)。

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

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

yr <- 2017
wk <- 31
ISOweek2date(sprintf("%4i-W%02i-%1i", yr, wk, 7))
 [1] "2017-08-06"

附录

请参阅 了解另一个用例和有关 ISOweek 包的更多背景信息。