我将日期编码为每周时间格式(欧洲公约 >> 01
到 52
/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
当使用 %U
或 %W
时,它会按照基本约定中定义的 01
周执行(所以“第 2 周”,实际上)
as.POSIXct("2016-01-1", format = "%Y-%W-%u")
# [1] "2016-01-04 CET"
最佳答案
由于我必须处理很多 ISO 周的报告,所以我创建了 ISOweek
package几年前。
该包包含函数 ISOweek2date()
,它返回给定星期日期(根据 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()
需要完整的 ISO week-based date采用 yyyy-Www-d
格式,包括星期几(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"
附录
请参阅 this answer有关 ISOweek
包的另一个用例和更多背景信息。
关于r - POSIX 日期从每周时间格式的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41597604/