R:如何判断同一周的Date?

Lea*_*210 0 r data.table

我想创建一个新的 colume 来表示哪个日期在同一周。

data.table DATE_SET 包含日期信息,例如:

DATA_SET<- data.table(transday = seq(from  = (Sys.Date()-64), to = Sys.Date(), by = 1))
Run Code Online (Sandbox Code Playgroud)

例如,'2017-03-01'和'2017-03-02'在同一周,'2017-03-01'和'2017-03-08'都是星期三,但它们不在同一周.

如果“2016-01-01”是2016年的第一周,“2017-01-01”是2017年的第一周,则值为1,但它们不在同一周。所以我想要独特的价值来指定“同一周”。

Uwe*_*Uwe 5

这个问题的答案很大程度上取决于

  • 一周第一天的定义(通常是星期日或星期一)和
  • 一年中的周数(从一年的第一个星期日、星期一或星期四开始,或从 1 月 1 日开始,等等)。

从下面的示例中可以看到一系列不同的选项:

      dates  isoweek day week_iso week_US week_UK DT_week DT_iso lub_week lub_iso   cut.Date
 2015-12-25 2015-W52   5 2015-W52      51      51      52     52       52      52 2015-12-21
 2015-12-26 2015-W52   6 2015-W52      51      51      52     52       52      52 2015-12-21
 2015-12-27 2015-W52   7 2015-W52      52      51      52     52       52      52 2015-12-21
 2015-12-28 2015-W53   1 2015-W53      52      52      52     53       52      53 2015-12-28
 2015-12-29 2015-W53   2 2015-W53      52      52      52     53       52      53 2015-12-28
 2015-12-30 2015-W53   3 2015-W53      52      52      53     53       52      53 2015-12-28
 2015-12-31 2015-W53   4 2015-W53      52      52      53     53       53      53 2015-12-28
 2016-01-01 2015-W53   5 2015-W53      00      00       1     53        1      53 2015-12-28
 2016-01-02 2015-W53   6 2015-W53      00      00       1     53        1      53 2015-12-28
 2016-01-03 2015-W53   7 2015-W53      01      00       1     53        1      53 2015-12-28
 2016-01-04 2016-W01   1 2016-W01      01      01       1      1        1       1 2016-01-04
 2016-01-05 2016-W01   2 2016-W01      01      01       1      1        1       1 2016-01-04
 2016-01-06 2016-W01   3 2016-W01      01      01       1      1        1       1 2016-01-04
 2016-01-07 2016-W01   4 2016-W01      01      01       2      1        1       1 2016-01-04
 2016-01-08 2016-W01   5 2016-W01      01      01       2      1        2       1 2016-01-04
Run Code Online (Sandbox Code Playgroud)

这是由此代码创建的:

library(data.table)

dates <- as.Date("2016-01-01") + (-7:7)
print(data.table(
  dates,
  isoweek   = ISOweek::ISOweek(dates),
  day       = ISOweek::ISOweekday(dates),
  week_iso  = format(dates, "%G-W%V"),
  week_US   = format(dates, "%U"),
  week_UK   = format(dates, "%W"),
  DT_week   = data.table::week(dates),
  DT_iso    = data.table::isoweek(dates),
  lub_week  = lubridate::week(dates),
  lub_iso   = lubridate::isoweek(dates),
  cut.Date  = cut.Date(dates, "week")  
), row.names = FALSE)     
Run Code Online (Sandbox Code Playgroud)

YYYY-Www某些列中使用的格式是ISO 8601 周格式之一。它包括按照 OP 的要求区分不同年份中不同周所需的年份。

ISO 周定义是确保每周始终由 7 天组成的唯一格式,跨新年也是如此。其他定义可能以少于 7 天的“周”开始或结束一年。由于年份的无缝划分,ISO 周编号年份 与传统的公历年略有不同,例如,2016-01-01属于 2015 年的最后一个 ISO 周 53 ( 2015-W53)。

正如此处所建议的,cut.Date()可能是 OP 的最佳选择。

披露:我是该ISOweek软件包的维护者,该软件包发布时strptime()无法识别R 的 Windows 版本中的输出%G%V格式规范。(直到今天,它们在输入中仍未被识别)。