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")
3 Réponses :
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.
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.
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
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))
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