2012-08-28 11 views
5

Ho una stringa di caratteri della data nel formato anno-settimana, come ad esempio:R - stringa di caratteri con week-Anno: settimana è persa durante la conversione in formato di data

weeks.strings <- c("2002-26", "2002-27", "2002-28", "2002-29", "2002-30", "2002-31") 

Tuttavia, la conversione di questo personaggio to Date risultati di classe in una perdita di settimana identificativo:

> as.Date(weeks.strings, format="%Y-%U") 
[1] "2002-08-28" "2002-08-28" "2002-08-28" "2002-08-28" "2002-08-28" 
[6] "2002-08-28" 

Come indicato sopra, il formato è convertito in Yearbook concatenato con la data di oggi, in modo che qualsiasi informazioni sulla settimana originale è perduto (ex - quando si utilizza la funzione di formattazione o tempo di provare e tornare indietro nel formato originale.

Una soluzione che ho trovato in un gruppo di aiuto è quello di specificare il giorno della settimana:

as.Date(weeks.strings, format="%Y-%u %U") 
[1] "2002-02-12" "2002-02-19" "2002-02-26" "2002-03-05" "2002-01-02" 
[6] "2002-01-09" 

Ma sembra che questo si traduce in numerazione settimana non corretta (non corrisponde alla stringa originale).

Qualsiasi consiglio sarebbe apprezzato.

+0

Le date non hanno un identificatore di settimana ... puoi aggiungere quello che ti aspetti dall'output? –

+0

Joshua: ho un valore associato a ogni punto dati settimanale. Voglio essere in grado di tracciare la settimana rispetto al valore, quindi conservare i dati come oggetto di data è importante per me per scopi di stampa. L'output previsto è uguale alla stringa di caratteri originale, ma di classe Date. – zzk

risposta

9

Hai solo bisogno di aggiungere un giorno della settimana per il vostro weeks.strings al fine di rendere le date inequivocabile (adattato da Jim Holtman's answer on R-help).

as.Date(paste(weeks.strings,1),"%Y-%U %u") 

Come sottolineato nei commenti, la classe Date non è appropriato se le date abbracciano un lungo orizzonte, perché - a un certo punto - il giorno della settimana scelto di non esisterà nella prima/ultima settimana dell'anno . In tal caso è possibile utilizzare un vettore numerico in cui l'intera parte è l'anno e la parte decimale è la frazione di settimane/anno. Ad esempio:

wkstr <- sprintf("%d-%02d", rep(2000:2012,each=53), 0:52) 
yrwk <- lapply(strsplit(wkstr, "-"), as.numeric) 
yrwk <- sapply(yrwk, function(x) x[1]+x[2]/53) 
+0

+1 Molto intelligente. –

+0

Questo è praticamente quello che stavo cercando, grazie! – zzk

+0

Purtroppo ho trovato un errore con questo metodo. Una stringa con la settimana 00 in esso ex - "2003-00" restituisce come NA dopo l'applicazione di questa funzione. Anche se forse l'errore è avere la settimana 0 in primo luogo? – zzk

4

Ovviamente, non esiste una soluzione univoca, poiché ogni settimana può essere rappresentata da un massimo di 7 date diverse. Detto questo, ecco un'idea:

weeks.strings <- c("2002-26", "2002-27", "2002-28", "2002-29", 
        "2002-30", "2002-31") 

x <- as.Date("2002-1-1", format="%Y-%m-%d") + (0:52*7) 
x[match(weeks.strings, format(x, "%Y-%U"))] 
# [1] "2002-07-02" "2002-07-09" "2002-07-16" "2002-07-23" 
# [5] "2002-07-30" "2002-08-06" 
+0

Non mi interessa quale giorno della settimana è specificato, purché coerente. Voglio solo tracciare la frequenza dei dati settimanali. – zzk

Problemi correlati