【问题标题】:Week Range Output in RR中的周范围输出
【发布时间】:2018-04-10 16:06:58
【问题描述】:

我正在编写一个 R 脚本,该脚本将在数据框中显示工作日范围和日期所在的星期。

我正在尝试显示的输出

--------------------------------------------------
 DateRange                    | Week                            
--------------------------------------------------
 1/7/2018  - 1/13/2018        |   2
--------------------------------------------------
 1/14/2018  - 1/20/2018       |   3
--------------------------------------------------
 1/21/2018  - 1/26/2018       |   4
--------------------------------------------------
library(data.table)
dd <- seq(as.IDate("2018-01-01"), as.IDate("2018-04-10"), 1)
dt <- data.table(i = 1:length(dd),
                 day = dd,
                 weekday = weekdays(dd),
                 day_rounded = round(dd, "weeks"))
## Now let's add the weekdays for the "rounded" date
dt[ , weekday_rounded := weekdays(day_rounded)]
## This seems to make internal sense with the "week" calculation
dt[ , weeknumber := week(day)]
dt$weekday_rounded <- NULL
dt$day_rounded <- NULL
dt

【问题讨论】:

  • 你不想要的结果是什么?代码和文字没有提到问题。

标签: r data.table


【解决方案1】:

如果我没记错的话,lubridate 可以帮忙:

library(lubridate)
library(data.table)

dd <- seq(as.IDate("2018-01-01"), as.IDate("2018-04-10"), 1)
dt <- data.table(i = 1:length(dd), day = dd)

dt[, week       := week(day),]
dt[, week_start := floor_date(day, unit = "week"),]
dt[, week_range := interval(week_start, week_start + days(6))]
dt[, week_start := NULL,]

输出:

       i        day week                     week_range
  1:   1 2018-01-01    1 2017-12-31 UTC--2018-01-06 UTC
  2:   2 2018-01-02    1 2017-12-31 UTC--2018-01-06 UTC
  3:   3 2018-01-03    1 2017-12-31 UTC--2018-01-06 UTC
  4:   4 2018-01-04    1 2017-12-31 UTC--2018-01-06 UTC
  5:   5 2018-01-05    1 2017-12-31 UTC--2018-01-06 UTC
  6:   6 2018-01-06    1 2017-12-31 UTC--2018-01-06 UTC
  7:   7 2018-01-07    1 2018-01-07 UTC--2018-01-13 UTC
  8:   8 2018-01-08    2 2018-01-07 UTC--2018-01-13 UTC
  9:   9 2018-01-09    2 2018-01-07 UTC--2018-01-13 UTC
 10:  10 2018-01-10    2 2018-01-07 UTC--2018-01-13 UTC
 .......

【讨论】:

  • 这两个包的函数名有很多重叠。可能要小心首先加载哪个。例如,lubridate::week 与 data.table::week
【解决方案2】:

如果您有一些表dt 带有day 列和其他任意列,您可以在data.table 的单个调用中添加iweekdayweeknumberWeekRange

dt[, ':='(
  i = .I,
  weekday = weekdays(day),
  WeekRange = paste(min(day), max(day), sep = ' - ')
), .(weeknumber = week(day))]

此方法的工作方式是按周数或周(天)对天进行分组,然后将这些组中的最小日期和最大日期粘贴在一起,以创建每周的日期范围。

这是一个可供试验的模拟表:

n <- 100
dt <-
  data.table(
    day = seq.Date(as.Date('2018-01-01'), by = 'day', length.out = n),
    a = runif(n),
    b = runif(n)
  )

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多