2011-08-24 12 views
10

Esiste un semplice linguaggio R per ottenere un vettore dei giorni in un determinato anno? Posso fare la seguente che fa ok ... tranne che per gli anni bisestili:Ottieni un vettore di tutti i giorni in un anno con R

dtt <- as.Date(paste(as.character(year), "-1-1", sep="")) + seq(0,364) 

ho potuto, ovviamente, aggiungere una riga per filtrare i valori nel (anno + 1) ma credo ci sia un gran modo più breve per farlo.

risposta

18

Che dire di questo:

R> length(seq(as.Date("2004-01-01"), as.Date("2004-12-31"), by="+1 day")) 
[1] 366 
R> length(seq(as.Date("2005-01-01"), as.Date("2005-12-31"), by="+1 day")) 
[1] 365 
R> 

Questo utilizza Nuttin', ma di base R per calcolare correttamente le date per dare il vostro vettore. Se vuoi operatori di livello superiore, guarda ad es. a lubridate o anche il mio più rudimentale RcppBDT che avvolge le parti della libreria Boost Time_Date.

+0

Basta aggiungere un '-1' dopo il secondo' as.Date'. – James

+0

Bello, non ci avevo pensato. Questo lo risolverà davvero. Vieni a pensarci, avrei potuto comunque usare il 20xx-12-31. –

7

Utilizzando la guida di Dirk ho optato per questo:

getDays <- function(year){ 
    seq(as.Date(paste(year, "-01-01", sep="")), as.Date(paste(year, "-12-31", sep="")), by="+1 day") 
} 
+1

Sono un tipo magnanimo;) –

0

Sarei interessato a sapere se sarebbe più veloce per invertire la sequenza e il casting as.Date:

# My function getDays 
getDays_1 <- function(year) { 
    d1 <- as.Date(paste(year, '-01-01', sep = '')); 
    d2 <- as.Date(paste(year, '-12-31', sep = '')); 
    as.Date(d1:d2, origin = '1970-01-01'); 
}; 

# other getDays 
getDays_2 <- function(year) {  
    seq(as.Date(paste(year, '-01-01', sep='')), 
     as.Date(paste(year, '-12-31', sep='')), 
     by = '+1 day'); 
}; 

test_getDays_1 <- function(n = 10000) { 
    for(i in 1:n) { 
    getDays_1(2000); 
    }; 
}; 

test_getDays_2 <- function(n = 10000) { 
    for(i in 1:n) { 
    getDays_2(2000); 
    }; 
}; 

system.time(test_getDays_1()); 
# user system elapsed 
# 4.80 0.00 4.81 

system.time(test_getDays_2()); 
# user system elapsed 
# 4.52 0.00 4.53 

I non lo so. . . sembra che il sequenziamento Date oggetti è leggermente più veloce di convertire un vettore di interi a Date s

0

avevo bisogno di qualcosa di simile, ma per una serie di date che voglio sapere il numero di giorni in quell'anno. Ho trovato la seguente funzione, che restituisce un vettore con la stessa lunghezza delle date nell'input.

days_in_year <- function(dates) { 
    years <- year(dates) 
    days <- table(year(seq(as.Date(paste0(min(years), '-01-01')), 
          as.Date(paste0(max(years), '-12-31')), 
          by = '+1 day'))) 
    as.vector(days[as.character(years)]) 
} 

Funziona in modo analogo alla soluzione di Dirk, tuttavia utilizza la funzione lubridate::year per ottenere la parte anno di tutte le date due volte. L'uso della tabella è uguale alla lunghezza, tuttavia per tutti gli anni unici. Potrebbe utilizzare un po 'più di memoria di quanto strettamente necessario se le date non sono in anni consecutivi.

Problemi correlati