2011-10-31 18 views

Respuesta

38

Una alternativa es formatear el objeto "POSIXt" usando 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 

que es preferible recordar que el día de los años es basado en cero en el estándar POSIX.

+0

Acaba de ejecutar en mi primer conjunto de datos con una columna 'POSIXct'. Pareció hora de marcar la suya como la respuesta aceptada. – Gregor

+0

@Gavin, ¿también es posible convertir una fecha en días desde un dato específico, por ejemplo, el número de días desde el 1 de marzo de 2015? También puedo publicar como una nueva pregunta ... –

+1

@ B.Davis Puede hacer algo como 'as.numeric (Sys.Date() - as.Date ('2015-03-01', format = '% Y- % m-% d ')) ' – Henry

17

Como ?POSIXlt revela, un $yday sufijo a un POSIXlt fecha (o incluso un vector de tal) se convertirá a día del año. Tenga en cuenta que POSIX cuenta el 1 de enero como el día 0, por lo que es posible que desee agregar 1 al resultado.

Me tomó muchísimo tiempo encontrar esto, así que pensé en ask and answer my own question.

Alternativamente, el excelente paquete lubridate proporciona la función yday, que es solo una envoltura para el método anterior. Define convenientemente funciones similares para otras unidades (month, year, hour, ...).

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

Parte de por qué me tomó tanto tiempo es que si 'd' es un objeto POSIXlt,' str (d) 'no da ninguna indicación de que' d' tiene otros atributos. Esto, y el hecho de que el operador '$' funciona en cuanto a los elementos en un vector de objetos POSIXlt significa que está ocurriendo algo más que una extracción habitual. Me gustaría leer un poco más sobre eso si alguien puede recomendar un buen lugar para comenzar. – Gregor

+0

Y, para responder a mi propio comentario, 'attributes' es el comando que estaba buscando,' attributes (d) 'proporciona todas las formas de mostrar' d'. – Gregor

+0

Je, yo estaba luchando con esta pregunta también. Parece que usted mismo lo respondió (en lugar de simplemente hacerlo sin publicarlo aquí). ¡Gracias por eso! – Mikko

0

Esta es la manera como lo hago:

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

Funciona bien para' POSIXlt' (como se menciona en mi respuesta), pero no para los objetos 'POSIXct'. Por ejemplo, 'Sys.time() $ yday' no funciona. – Gregor

2

Me di cuenta que no es lo que el cartel estaba buscando, pero necesitaba para convertir POSIX fecha- veces en un fraccional los días del año para el análisis de series de tiempo y terminó haciendo esto:

today <- Sys.time() 

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

¡Parece útil! Tienes mi voto. – Gregor

Cuestiones relacionadas