5
votes

Attribution d'un numéro de semaine personnalisé dans R

J'ai un ensemble de données dont la date de commande est du 01/07/2017 au 30/06/2018. Je veux extraire le numéro de semaine. Je veux attribuer le numéro de semaine 01 pour les jours correspondant du 01/07 au 07/07 et ainsi de suite. J'ai utilisé le package lubridate mais il prend le 01/01 comme point de départ. Y a-t-il un moyen de définir la valeur de décalage? Mon code:

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") 

r

1 commentaires

Je ne comprends pas complètement. Certains des jours se répètent-ils? Sinon, une solution rapide peut être quelque chose comme sort (rep (1:52, 7)) . Sinon, la solution de JonnyCrunch semble adaptable


3 Réponses :


4
votes

Que pensez-vous de cette approche?

 customweek("20170107", "20170101")

dataweek sera votre date et date d'origine de votre point de départ (tous deux au format AAAA / MM / JJ). Par conséquent:

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

Produit 1 comme résultat.


1 commentaires

Belle approche :). Peut-être utiliser plafond au lieu de round si je comprends bien. De plus, il semble que le format de la date soit en dmy dans la question.



3
votes

J'utiliserais probablement une fonction comme celle-ci, qui utilise l'opérateur de division entier de R, % /% , pour calculer le nombre de semaines à partir du nombre de jours après l'origine:

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 commentaires

0
votes

Vous pouvez transformer vos données en un objet xts et utiliser la puissance de l'attribut index .

> 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

Résultat: p>

# 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))


0 commentaires