我的日期以每周时间格式编码(欧洲会议>> 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"
哦,我认为使用%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"
没有,还没完成/仍然困惑:这种方法在第一周不起作用
(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"
答案 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))
包的其他用例和更多背景信息。