转换年/周至日期对象

时间:2017-08-07 14:32:22

标签: r date lubridate

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

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

我不必使用 lubridate ,也可以使用其他包。

2 个答案:

答案 0 :(得分:19)

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

Base R的strptime()函数知道一年中的3个定义(但在输入时只支持2个)和2个工作日数定义, 见?strptime

一年中的一周

  • 美国会议:使用星期日作为一周中的第一天(通常以一年中的第一个星期日为一天)作为十进制数字(00-53)的一年中的一周第1周1):%U

  • 英国会议:使用星期一作为一周的第一天的十进制数字(00-53)的一年中的一周(通常在一年的第一个星期一作为第1天的第1天)第1周):%W

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

数字工作日

  • 工作日作为十进制数字(1-7,星期一为1):%y
  • 工作日作为十进制数(0-6,星期日为0):%u
  • 有趣的是,没有格式的星期日被计算为一周的第1天。

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

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

%w

对于工作日格式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,我们会得到相同的结果,因为第1天是两个约定中的星期一(但在处理星期日时请注意)。

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

%w

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

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

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

如上所述,您需要指定一周中的某一天才能获得完整的日历日期。如果日期需要按月汇总,则也需要这样做。

如果没有指定工作日,并且日期应该按月汇总,则可以将每周的星期四作为参考日(a suggestion by djhurio之后)。这确保将整周分配给一周中大多数日期所属的月份。

例如,将星期日作为参考日将返回

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

因此将整周与3月关联,尽管一周中只有一天属于3月,而其他6天属于2月。以周四作为参考日将在2月返回日期:

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

答案 1 :(得分:0)

是的,ISOweek软件包可以这样做

ISOweek::ISOweek2date(isoWeek)

但是要换个方向,还要检查较新的lubridate软件包

ISOweek::date2ISOweek(yourDate)

lubridate::isoweek(ymd(yourDate))