R 获取第53周第一天的POSIX日期(ISO约定)

R 获取第53周第一天的POSIX日期(ISO约定),r,date,posixct,strptime,dayofweek,R,Date,Posixct,Strptime,Dayofweek,我的日期信息是-,我想告诉R“给我这些周中每一周的头几天的POSIX日期”,我该怎么做 我通过将“-1”(用于“每周第一天”)粘贴到-字符串的向量上,然后在调用as.POSIXct的第1-52周使用转换规范%u,但在第53周不使用 例子 ISOweek解决方案: library(ISOweek) weeks <- as.character(1:53) weeks[nchar(weeks) == 1] <- paste0("0", weeks[nchar(weeks) == 1]) f

我的日期信息是
-
,我想告诉R“给我这些周中每一周的头几天的POSIX日期”,我该怎么做

我通过将
“-1”
(用于“每周第一天”)粘贴到
-
字符串的向量上,然后在调用
as.POSIXct
的第1-52周使用转换规范
%u
,但在第53周不使用

例子
ISOweek
解决方案:

library(ISOweek)
weeks <- as.character(1:53)
weeks[nchar(weeks) == 1] <- paste0("0", weeks[nchar(weeks) == 1])
first_day_of_week_wday <- paste0("2015-W", weeks, "-1")
ISOweek2date(first_day_of_week_wday)
library(ISOweek)

周ISO周
解决方案:

library(ISOweek)
weeks <- as.character(1:53)
weeks[nchar(weeks) == 1] <- paste0("0", weeks[nchar(weeks) == 1])
first_day_of_week_wday <- paste0("2015-W", weeks, "-1")
ISOweek2date(first_day_of_week_wday)
library(ISOweek)

周基本R
解决方案:

您无法生成第53周的值,因为
strtime
无法识别在此期间存在“完整”的星期一。如果日期变为2016年第1周,而不是2015年第53周,则代码有效

weeks <- c(1:52,1)
yr <- c(rep('2015-',52),'2016-')
weeks[nchar(weeks) == 1] <- paste0("0", weeks[nchar(weeks) == 1])
first_day_of_week_wday <- paste0(yr, weeks, "-1")
first_day_of_week_posix <- as.POSIXct(first_day_of_week_wday,
                                      format = "%Y-%U-%u")

data.frame(
  wday = first_day_of_week_wday,
  posix = first_day_of_week_posix,
  stringsAsFactors = FALSE
)

        wday      posix
1   2015-1-1 2015-01-05
2   2015-2-1 2015-01-12
3   2015-3-1 2015-01-19
4   2015-4-1 2015-01-26
5   2015-5-1 2015-02-02
6   2015-6-1 2015-02-09
7   2015-7-1 2015-02-16
8   2015-8-1 2015-02-23
9   2015-9-1 2015-03-02
10 2015-10-1 2015-03-09
11 2015-11-1 2015-03-16
12 2015-12-1 2015-03-23
13 2015-13-1 2015-03-30
14 2015-14-1 2015-04-06
15 2015-15-1 2015-04-13
16 2015-16-1 2015-04-20
17 2015-17-1 2015-04-27
18 2015-18-1 2015-05-04
19 2015-19-1 2015-05-11
20 2015-20-1 2015-05-18
21 2015-21-1 2015-05-25
22 2015-22-1 2015-06-01
23 2015-23-1 2015-06-08
24 2015-24-1 2015-06-15
25 2015-25-1 2015-06-22
26 2015-26-1 2015-06-29
27 2015-27-1 2015-07-06
28 2015-28-1 2015-07-13
29 2015-29-1 2015-07-20
30 2015-30-1 2015-07-27
31 2015-31-1 2015-08-03
32 2015-32-1 2015-08-10
33 2015-33-1 2015-08-17
34 2015-34-1 2015-08-24
35 2015-35-1 2015-08-31
36 2015-36-1 2015-09-07
37 2015-37-1 2015-09-14
38 2015-38-1 2015-09-21
39 2015-39-1 2015-09-28
40 2015-40-1 2015-10-05
41 2015-41-1 2015-10-12
42 2015-42-1 2015-10-19
43 2015-43-1 2015-10-26
44 2015-44-1 2015-11-02
45 2015-45-1 2015-11-09
46 2015-46-1 2015-11-16
47 2015-47-1 2015-11-23
48 2015-48-1 2015-11-30
49 2015-49-1 2015-12-07
50 2015-50-1 2015-12-14
51 2015-51-1 2015-12-21
52 2015-52-1 2015-12-28
53  2016-1-1 2016-01-04

weeks基本R
解决方案:

您无法生成第53周的值,因为
strtime
无法识别在此期间存在“完整”的星期一。如果日期变为2016年第1周,而不是2015年第53周,则代码有效

weeks <- c(1:52,1)
yr <- c(rep('2015-',52),'2016-')
weeks[nchar(weeks) == 1] <- paste0("0", weeks[nchar(weeks) == 1])
first_day_of_week_wday <- paste0(yr, weeks, "-1")
first_day_of_week_posix <- as.POSIXct(first_day_of_week_wday,
                                      format = "%Y-%U-%u")

data.frame(
  wday = first_day_of_week_wday,
  posix = first_day_of_week_posix,
  stringsAsFactors = FALSE
)

        wday      posix
1   2015-1-1 2015-01-05
2   2015-2-1 2015-01-12
3   2015-3-1 2015-01-19
4   2015-4-1 2015-01-26
5   2015-5-1 2015-02-02
6   2015-6-1 2015-02-09
7   2015-7-1 2015-02-16
8   2015-8-1 2015-02-23
9   2015-9-1 2015-03-02
10 2015-10-1 2015-03-09
11 2015-11-1 2015-03-16
12 2015-12-1 2015-03-23
13 2015-13-1 2015-03-30
14 2015-14-1 2015-04-06
15 2015-15-1 2015-04-13
16 2015-16-1 2015-04-20
17 2015-17-1 2015-04-27
18 2015-18-1 2015-05-04
19 2015-19-1 2015-05-11
20 2015-20-1 2015-05-18
21 2015-21-1 2015-05-25
22 2015-22-1 2015-06-01
23 2015-23-1 2015-06-08
24 2015-24-1 2015-06-15
25 2015-25-1 2015-06-22
26 2015-26-1 2015-06-29
27 2015-27-1 2015-07-06
28 2015-28-1 2015-07-13
29 2015-29-1 2015-07-20
30 2015-30-1 2015-07-27
31 2015-31-1 2015-08-03
32 2015-32-1 2015-08-10
33 2015-33-1 2015-08-17
34 2015-34-1 2015-08-24
35 2015-35-1 2015-08-31
36 2015-36-1 2015-09-07
37 2015-37-1 2015-09-14
38 2015-38-1 2015-09-21
39 2015-39-1 2015-09-28
40 2015-40-1 2015-10-05
41 2015-41-1 2015-10-12
42 2015-42-1 2015-10-19
43 2015-43-1 2015-10-26
44 2015-44-1 2015-11-02
45 2015-45-1 2015-11-09
46 2015-46-1 2015-11-16
47 2015-47-1 2015-11-23
48 2015-48-1 2015-11-30
49 2015-49-1 2015-12-07
50 2015-50-1 2015-12-14
51 2015-51-1 2015-12-21
52 2015-52-1 2015-12-28
53  2016-1-1 2016-01-04


weeks您有没有看过
isoweek
软件包
IsowekDate
应该可以解决您的问题。@user3293236:如果可能的话,我想让它在R基内工作。但是谢谢你的建议。我对我的答案做了更多的解释。希望这对windows上的ISO标准有所帮助。您使用的是一年中的哪一周的不同定义?美国、英国还是ISO公约?请参阅我的答案以获得解释。@uWhe ISO Convention您是否看过
isoweek
软件包
IsowekDate
应该可以解决您的问题。@user3293236:如果可能的话,我想让它在R基内工作。但是谢谢你的建议。我对我的答案做了更多的解释。希望这对windows上的ISO标准有所帮助。您使用的是一年中的哪一周的不同定义?美国、英国还是ISO公约?请参阅我的答案以获得解释。@U我们遵守ISO公约太好了,谢谢你的努力。我提取了使用ISOweek解决方案所需的所有代码,而不依赖于整个包。不过,我还是有点震惊,这似乎不可能在WindowsR上实现。太好了,谢谢你的努力。我提取了使用ISOweek解决方案所需的所有代码,而不依赖于整个包。不过,我还是有点震惊,这似乎不可能在WindowsR上实现。好吧,很好。这确实让人感觉不舒服,但至少现在我知道如何处理53周的案件了。谢谢正确答案取决于使用的年度周惯例:美国、英国或ISO。根据美国和英国的惯例,2015年没有第53周(但2012年和2017年有一周)。但根据ISO公约,2015年是第53周。OP现在已经确认他正在使用ISO公约。因此,您的答案返回了错误的结果,因为2015年第一个ISO周(2015-W01)从2014-12-29星期一开始。因此,所有的周数都减少了一个。2015年最后一个ISO周(2015-W53)从2015-12-28星期一开始。好的,很好。这确实让人感觉不舒服,但至少现在我知道如何处理53周的案件了。谢谢正确答案取决于使用的年度周惯例:美国、英国或ISO。根据美国和英国的惯例,2015年没有第53周(但2012年和2017年有一周)。但根据ISO公约,2015年是第53周。OP现在已经确认他正在使用ISO公约。因此,您的答案返回了错误的结果,因为2015年第一个ISO周(2015-W01)从2014-12-29星期一开始。因此,所有的周数都减少了一个。2015年最后一个ISO周(2015-W53)从2015年12月28日星期一开始。