R:如何判断同一周的日期?

时间:2017-05-04 06:20:24

标签: r data.table

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

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

DATA_SET<- data.table(transday = seq(from  = (Sys.Date()-64), to = Sys.Date(), by = 1))

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

如果“2016-01-01”是2016年的第一周,“2017-01-01”是2017年的第一周,价值为1,但它们不在同一周。所以我希望这个独特的价值能够“同一周”。

2 个答案:

答案 0 :(得分:3)

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

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

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

      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

由此代码创建:

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)     

某些列中使用的格式YYYY-WwwISO 8601 week formats之一。它包括根据OP要求区分不同年份不同周的所需的年份。

ISO周定义是唯一一种确保每周总共包含7天的格式,也适用于新年。其他定义可能以“周”开始或结束,少于7天。由于年度的无缝分配, ISO周编号年与传统的公历年略有不同,例如,2016-01-01属于2015年的最后一个ISO周53({ {1}})。

根据建议here2015-W53可能是OP的最佳选择。

披露:我是cut.Date()软件包的维护者,该软件包是在ISOweek无法识别strptime()和{{1}时发布的在Windows版本的R中输出的格式规范。(现在仍然无法在输入中识别它们。)

答案 1 :(得分:1)

您可以使用R。

week()包的lubridate功能
library(lubridate)
DATA_SET$week <- week(DATA_SET$transday)

这会为您提供一个新列week。同一周内的日期将具有相同的周数。