将 year/week 转换为日期对象

Transform year/week to date object

字符串包含 'YEAR WEEK',我想用 parse_date_time() 将它转换为日期对象,但我无法使代码工作:

parse_date_time(c("201510"), "YW")

我不一定要用lubridate,其他包也可以。

在将年-周转换为日期之前,您必须指定星期几,但更重要的是,您必须确保使用了不同约定中的哪一个。

Base R 的 strptime() 函数知道 一年中的一周 的 3 个定义(但在输入时仅支持其中的 2 个)和 的 2 个定义星期几, 见 ?strptime:

一年中的第几周

  • 美国惯例:一年中的第几周为十进制数 (00–53),使用星期日作为一周的第一天(通常使用一年中的第一个星期日作为第 1 周的第 1 天):%U

  • 英国惯例:一年中的第几周为十进制数 (00–53),使用星期一作为一周的第一天(通常是第一个星期一一年中第 1 周的第 1 天):%W

  • ISO 8601 定义:按照 ISO 8601 的定义,一年中的第几周为十进制数 (01–53)。如果一周(从星期一开始)包含 1 January 在新年有四天或更多天,则认为是第 1 周。否则,它是上一年的最后一周,下周是​​第 1 周:%V 被接受但被忽略输入时。
    请注意,还有一个基于周的年份(%G%g)将与 %V 一起使用,因为它可能不同于日历年(%Y%y).

数字工作日

  • 十进制数形式的工作日(1–7,星期一为 1):%u
  • 十进制数的工作日(0–6,星期日为 0):%w
  • 有趣的是,周日算作一周的第 1 天的情况下没有格式。

使用不同的约定转换年-周-日

如果我们将第 1 天附加到字符串并使用不同的格式,我们会得到

as.Date("2015101", "%Y%U%u")
# [1] "2015-03-09"
as.Date("2015101", "%Y%U%w")
# [1] "2015-03-09"
as.Date("2015101", "%Y%W%u")
# [1] "2015-03-09"
as.Date("2015101", "%Y%W%w")
# [1] "2015-03-09"
as.Date("2015101", "%G%V%u")
# [1] NA

对于工作日格式 %u%w 我们确实得到了相同的结果,因为在这两种约定中第 1 天都是星期一(但在处理星期日时要小心)。

对于 2015 年,美国和英国对一年中一周的定义是一致的,但并非所有年份都如此,例如,2001 年、2007 年和 2018 年:

as.Date("2018101", "%Y%U%u")
#[1] "2018-03-12"
as.Date("2018101", "%Y%W%u")
#[1] "2018-03-05"

输入不支持 ISO 8601 格式说明符。因此,我在几年前创建了 ISOweek package

ISOweek::ISOweek2date("2015-W10-1")
#[1] "2015-03-02"

编辑:使用星期四将一周与一个月相关联

如上所述,您需要指定星期几才能获得完整的日历日期。如果以后需要按月汇总日期,这也是必需的。

如果没有指定工作日,如果要在以后按月汇总日期,则可以将每周的星期四作为参考日(之后)。这确保整个星期都分配给一周中大部分天数所属的月份。

例如,以星期日为参考日将return

ISOweek::ISOweek2date("2015-W09-7")
[1] "2015-03-01"

因此,尽管一周中只有一天属于三月,而其他 6 天属于二月,但因此会将整个星期与三月相关联。以星期四为参考日将return二月的日期:

ISOweek::ISOweek2date("2015-W09-4")
[1] "2015-02-26"

是的,ISOweek 包可以做到这一点

ISOweek::ISOweek2date(isoWeek)

但是对于另一个方向,还要检查较新的 lubridate

ISOweek::date2ISOweek(yourDate)

lubridate::isoweek(ymd(yourDate))