2013-03-19 4 views
4

У меня есть данные на протяжении более 3 лет. За каждый год я хочу найти день, соответствующий Янарию 1 того года. Например:Convert to the day and time of the year in R

> x <- c('5/5/2007','12/31/2007','1/2/2008') 
> #Convert to day of year (julian date) – 
> strptime(x,"%m/%d/%Y")$yday+1 
[1] 125 365 2 

Я хочу знать, как сделать то же самое, но с добавленным временем. Но я все равно получаю не время. Может ли кто-нибудь предложить, какой лучший способ найти дату юлиан с датой и временем?

> x1 <- c('5/5/2007 02:00','12/31/2007 05:58','1/2/2008 16:25') 
> #Convert to day of year (julian date) – 
> strptime(x1,"%m/%d/%Y %H:%M")$yday+1 
[1] 125 365 2 

В отличие от этого результата, я хочу получить результат в десятичные дни. Например, первый пример будет 125.0833333 и так далее.

Большое вам спасибо.

+0

Что вы хотите, чтобы ваш выход выглядеть? – alexwhan

+0

Я хочу выход в десятичные дни. Например, первый пример будет 125.0833333 и так далее. –

ответ

8

Ожидаете ли вы получить день + числовую часть дня в качестве выходного? Если это так, то, как это будет работать:

test <- strptime(x1,"%m/%d/%Y %H:%M") 

(test$yday+1) + (test$hour/24) + (test$min/(24*60)) 
#[1] 125.083333 365.248611 2.684028 

Хотя это соответствует тому, что вы просите, я думаю, снимая +1 может сделать больше смысла:

(test$yday) + (test$hour/24) + (test$min/(24*60)) 
#[1] 124.083333 364.248611 1.684028 

Хотя мои Spidey чувства покалывания, что Дирк собираюсь показать и показать мне, как это сделать с POSIXct представлением даты/времени.

Вот попытка такого ответа, используя базовые функции:

mapply(julian, as.POSIXct(test), paste(format(test,"%Y"),"01","01",sep="-")) 
#[1] 124.083333 364.248611 1.684028 
+0

Ваши чувства spidey в огне сегодня – alexwhan

+0

@ thelatemail: Ваши чувства находятся на месте. Да, я думаю, что удаление '+ 1' имеет больше смысла, как вы сказали. Большое вам спасибо за ваш ответ. –

8

Вы также можете использовать POSIXct и POSIXlt представления наряду с firstof функцией от xts.

x1 <- c("5/5/2007 02:00", "12/31/2007 05:58", "1/2/2008 16:25") 
x1 
## [1] "5/5/2007 02:00" "12/31/2007 05:58" "1/2/2008 16:25" 


y <- as.POSIXlt(x1, format = "%m/%d/%Y %H:%M") 

result <- mapply(julian, x = as.POSIXct(y), origin = firstof(y$year + 1900)) 

result 
## [1] 124.083333 364.248611 1.684028 

, если вы не хотите использовать XTS, то, возможно, что-то вроде этого

result <- mapply(julian, 
       x = as.POSIXct(x1, format = "%m/%d/%Y %H:%M", tz = "GMT"), 
       origin = as.Date(paste0(gsub(".*([0-9]{4}).*", "\\1", x1), 
             "-01-01"), 
            tz = "GMT")) 

result 
## [1] 124.083333 364.248611 1.684028 
+0

Большое вам спасибо за этот ответ. –

+0

@geektrader - есть ли причина для gsub/as.date? - Я только что добавил более простой вариант к моему ответу, но мне любопытно, если я что-то упустил. – thelatemail

+0

@thelatemail nope .. просто не думал об этом –