Назначение пользовательского номера недели в R - PullRequest
0 голосов
/ 28 января 2019

У меня есть набор данных с датой заказа, начиная с 01/07/2017 по 30/06/2018.Я хочу извлечь номер недели. Я хочу назначить номер недели 01 для дней, соответствующих с 01/07 по 07/07 и так далее.Я использовал пакет lubridate, но он принимает 01/01 в качестве отправной точки. Есть ли способ установить значение смещения?Мой код:

order$start_week_date <-  floor_date(as.Date(order$order_date), 
unit="week" , week_start = getOption("lubridate.week.start", 1))
order$week_no <-   strftime( order$start_week_date ,format="%V") 

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Я бы, вероятно, использовал функцию, подобную следующей, которая использует оператор целочисленного деления R, %/%, для вычисления количества недель от количества дней после происхождения:

library(lubridate)

f <- function(date, origin) {
    (as.numeric(dmy(date) - dmy(origin)) %/% 7) + 1
}

## Try it out
dd <- c("01/07/2017", "07/07/2017", "08/07/2017", "30/06/2018")
f(dd, origin = "01/07/2017")
## [1]  1  1  2 53
0 голосов
/ 28 января 2019

Вы можете преобразовать свои данные в объект xts и использовать мощность атрибута index.

# mock-up data
data <- data.frame(dates=seq(from = as.Date("2017-07-01"), to = as.Date("2018-06-30"), by = "days"), data = rnorm(length(dates)))


# load libraries
library(xts) # a powerful library that makes work with time series pretty easy
library(dplyr)

# create an xts object (an xts object is formed by the matrix of observations, ordered by an index of dates)
df_xts <- xts(data[,-1], order.by = data$dates)

data <- data %>%
# use ".indexweek" to return the week number since beginning of 1970
  mutate(week_nr = .indexweek(df_xts)) %>%
# assign week number starting from 1
  mutate(week_nr = week_nr - min(week_nr) + 1) %>%
# maybe add 0 in front of weeks 1-9
  mutate(week_nr = ifelse(week_nr < 10, paste0("0", week_nr), week_nr))

Вывод:

> head(data)
       dates        data week_nr
1 2017-07-01 -0.99142495      01
2 2017-07-02  0.19130095      01
3 2017-07-03 -0.03775566      02
4 2017-07-04  1.24858796      02
5 2017-07-05  0.59453045      02
6 2017-07-06 -0.18317437      02
0 голосов
/ 28 января 2019

Как вам нравится этот подход?

customweek <- function(dateweek, dateorigin){
  return(as.integer(round((ymd(dateweek)-ymd(dateorigin)  + 1)/7,0)))
}

dataweek будет вашей датой и датой или отправной точкой (обе в формате ГГГГ / ММ / ДД).Следовательно:

 customweek("20170107", "20170101")

Создает 1 как результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...