2011-10-31 5 views

risposta

38

Un'alternativa è per formattare l'oggetto "POSIXt" utilizzando strftime():

R> today <- Sys.time() 
R> today 
[1] "2012-10-19 19:12:04 BST" 
R> doy <- strftime(today, format = "%j") 
R> doy 
[1] "293" 
R> as.numeric(doy) 
[1] 293 

che è preferibile ricordare che il giorno degli anni è a base zero nello standard POSIX.

+0

Ho appena eseguito il mio primo set di dati con una colonna 'POSIXct'. Sembrava il momento di contrassegnare il tuo come la risposta accettata. – Gregor

+0

@Gavin, è anche possibile convertire una data in giorni da un dato specificato, ad esempio numero di giorni dal 1 ° marzo 2015? Posso anche postare una nuova domanda ... –

+1

@ B.Davis Puoi fare qualcosa come 'as.numeric (Sys.Date() - as.Date ('2015-03-01', format = '% Y- % m-% d ')) ' – Henry

17

Come rivela ?POSIXlt, un suffisso $yday a una data POSIXlt (o anche un vettore di tale valore) verrà convertito in giorno dell'anno. Attenzione che POSIX conta 1 gennaio come giorno 0, quindi potresti voler aggiungere 1 al risultato.

Mi ci è voluto molto tempo per trovare questo, quindi ho pensato che avrei ask and answer my own question.

In alternativa, l'eccellente pacchetto lubridate fornisce la funzione yday, che è solo un wrapper per il metodo precedente. Definisce convenientemente funzioni simili per altre unità (month, year, hour, ...).

today <- Sys.time() 
yday(today) 
+0

Parte del motivo per cui mi c'è voluto così tanto tempo è che se 'd' è un oggetto POSIXlt,' str (d) 'non fornisce alcuna indicazione che' d' ha ulteriori attributi. Questo, e che l'operatore '$' lavora in maniera elementale su un vettore di oggetti POSIXlt significa molto di più di una semplice estrazione in corso. Sarei interessato a leggere un po 'di più su questo se qualcuno può consigliare un bel posto da cui iniziare. – Gregor

+0

E, per rispondere al mio commento, 'attributes' è il comando che stavo cercando,' attributes (d) 'fornisce tutti i modi di visualizzare' d'. – Gregor

+0

Heh, anche io stavo lottando con questa domanda. Sembra che tu abbia risposto tu stesso (al contrario di farlo semplicemente senza pubblicarlo qui). Grazie per quello! – Mikko

0

Questo è il modo in cui lo faccio:

as.POSIXlt(c("15.4", "10.5", "15.5", "10.6"), format = "%d.%m")$yday 
# [1] 104 129 134 160 
+0

Funziona bene per' POSIXlt' (come menzionato nella mia risposta), ma non per gli oggetti 'POSIXct'. Ad esempio, 'Sys.time() $ yday' non funziona. – Gregor

2

mi rendo conto che non è proprio ciò che il poster stava cercando, ma avevo bisogno di convertire POSIX data-volte in un frazionale giorno dell'anno per l'analisi delle serie storiche e ha finito per fare questo:

today <- Sys.time() 

doy2015f<-difftime(today,as.POSIXct(as.Date("2015-01-01 00:00", tzone="GMT")),units='days') 
+0

Sembra utile! Hai il mio voto. – Gregor

Problemi correlati