【发布时间】:2017-05-26 15:23:08
【问题描述】:
我有以每周时间格式编码的日期(欧洲惯例 >> 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"
【问题讨论】:
-
您可以将日期减少为年-周数,但您不能返回,因为该周有七个可能的值。
-
@DirkEddelbuettel:啊哈,这很有道理。您知道任何解决方法吗?我确实需要推断月份,我并不关心确切的日期
-
从内存中还有一个 weekday 格式化程序。如果你只是附加一个值(比如一个),你应该有一周的开始。
-
@DirkEddelbuettel 谢谢德克! R 似乎并不真正喜欢
%V,尽管它在strptime中说它喜欢;-) 一如既往:多么痛苦。在这方面:感谢anydate! -
正如this answer 中更详细地解释的那样,当将日期格式化为 ISO 周时,您需要使用基于周的年份格式说明符
%G而不是%Y,即%G-W%V-%u用于符合 ISO 8601 的格式之一。