R:错误地将ISO周转换为日期

问题描述 投票:3回答:2

我有一年,一个ISO周和一个工作日(2015年,第7周,工作日1 = 2015-02-09),我想将它转换为日期。

所以我按照以下方式做到:

date <- "2015:7:1"

as.Date(date, format="%Y:%V:%u")
[1] "2015-03-25"

你可以看到我得到了错误的日期(今天是这样)。当使用另一个格式字符串(%U或%W而不是%V)时,我得到“2015-02-16” - 一周太晚了,因为%U和%W从0开始计算周数。

%V我错过了什么?

r as.date
2个回答
4
投票

问题是你可以使用%V输出,但不能输入。请注意? strptime

%V:作为ISO 8601中定义的十进制数(01-53)的一年中的一周。如果包含1月1日的一周(从星期一开始)在新的一年中有四天或更多天,那么它将被视为第1周。否则,它是上一年的最后一周,下一周是第1周。(接受但输入时忽略。)

所以,这意味着你应该使用%W并减去一周:

as.Date("2015:7:1", format = "%Y:%W:%u") - 7
[1] "2015-02-09"

然后注意输出上如何允许%V

strftime(as.Date("2015:7:1", format = "%Y:%W:%u") - 7, "%Y:%V:%u")
[1] "2015:07:1"

0
投票

我想提醒一下。建议的计算方法并不总是如此,例如:

isoyear = c(2015, 2015)
isoweek = c(52, 53)
iyw=paste(isoyear,isoweek,1,sep=":")
as.Date(iyw, format = "%Y:%W:%u") - 7
[1] "2015-12-21" NA

但如果我们检查“2015-12-31”的isoweek,我们得到以下内容:

isoweek("2015-12-28")
[1] 53

最好使用ISOweek包中的函数ISOweek2date()代替。

© www.soinside.com 2019 - 2024. All rights reserved.