【问题标题】:POSIX date from dates in weekly time formatPOSIX 日期来自每周时间格式的日期
【发布时间】:2017-05-26 15:23:08
【问题描述】:

我有以每周时间格式编码的日期(欧洲惯例 >> 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

当使用 %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 的格式之一。

标签: r date posix


【解决方案1】:

由于我必须处理很多按 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 周数,则必须创建一个字符串并指定一周中的某一天。

许多报告中的一个典型短语是,例如,“reporting week 31 ending 2017-08-06”:h

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

附录

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多