将 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))
字符串包含 '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))