字符串包含'YEAR WEEK',我想用parse_date_time()
将它转换为日期对象,但我无法使代码工作:
parse_date_time(c("201510"), "YW")
我不必使用 lubridate ,也可以使用其他包。
答案 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}})。
%y
%u
如果我们将第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))