Poiché la domanda ha stabilito che la settimana va da 00 a 53, assumiamo che il numero della settimana sia il numero di giovedì dell'anno precedente o precedente alla data in questione. Pertanto, il primo giovedì dell'anno inizia la settimana 1 e la settimana 0 viene assegnata a tutti i giorni precedenti.
(Ci sono stati commenti che se il primo giorno dell'anno fosse martedì, allora sarebbe la settimana 1, ma se così fosse non ci potrebbe mai essere una settimana 0 come sembra essere richiesto nell'argomento quindi qualche chiarimento su può essere richiesta la definizione del numero della settimana, qui utilizzeremo la definizione nel paragrafo precedente, ma non sarebbe difficile cambiarla se sapessimo quale fosse la definizione, ad esempio, se avessimo sempre desiderato la prima settimana nell'anno per essere 1 anche se fosse una settimana breve, potremmo aggiungere !is.thu(jan1(d))
al risultato.)
Entrambe le soluzioni di seguito sono abbastanza brevi da poter essere espresse in una dichiarazione; tuttavia, li abbiamo suddivisi in diverse brevi funzioni ciascuna per chiarezza. Il primo è particolarmente semplice, ma il secondo è automaticamente vettorizzato senza la necessità di un sapply
e probabilmente sarebbe più efficiente.
1. somma giovedì nell'anno Questa soluzione presuppone l'ingresso d
è di classe "Date"
e solo riassume il numero di giovedì durante l'anno prima o su di esso:
is.thu <- function(x) weekdays(x) == "Thursday"
jan1 <- function(x) as.Date(cut(x, "year"))
week4 <- function(d) {
sapply(d, function(d) sum(is.thu(seq(jan1(d), d, by = "day"))))
}
possiamo testare in questo modo :
d <- as.Date(c("2013-01-04", "2013-01-26", "2013-02-03", "2013-02-09",
"2013-02-20", "2013-03-03"))
week4(d) # 1 4 5 6 7 9
2. nextthu
In base alla funzione nextfri
nello zoo quickref vignette, vediamo che il numero di giorni da Epoch (1970-01-01) del giovedì successivo (o il giorno in questione se è già un giovedì) è dato da nextthu
nel primo linea sotto.Applicando questo per il primo giorno dell'anno si ricava il risultato in cui d
è come prima:
nextthu <- function(d) 7 * ceiling(as.numeric(d)/7)
week4a <- function(d) (as.numeric(d) - nextthu(jan1(d))) %/% 7 + 1
e qui è una prova
week4a(d) # 1 4 5 6 7 9
aggiunto: Corretto il bug nella seconda soluzione.
Perché vorresti farlo, se posso chiedere? – Arun
Quindi se un anno è iniziato il martedì, la settimana 1 è Mar/Mer e la settimana 2 inizia giovedì ...? – joran
si. La settimana dovrebbe essere da martedì fino a mercoledì incluso. – Eco06