3

我有一年,一个 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 什么?

4

2 回答 2

5

问题是您可以%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"
于 2015-03-25T10:27:17.263 回答
5

我想提醒一下。建议的计算方式并不总是按应有的方式工作,例如:

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("2015-12-28")
[1] 53

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

于 2017-12-18T13:58:33.220 回答