简体   繁体   中英

Convert to the day and time of the year in R

I have data for more than 3 years. For each year I want to find the day corresponding to Jaunary 1 of that year. For example:

> 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

I want to know how to do the same thing but with time added. But I still get the day not time. Can anyone suggest what is the better way to find the julian date with date and time ?

> 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

Rather than this result, I want the output in decimal days. For example the first example would be 125.0833333 and so on.

Thank you so much.

Are you hoping to get the day + a numerical part of a day as output? If so, something like this will work:

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

Although this matches what you ask for, I think removing the +1 might make more sense:

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

Though my spidey senses are tingling that Dirk is going to show up and show me how to do this with a POSIXct date/time representation.

Here is an attempt of such an answer using base functions:

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

You can also use POSIXct and POSIXlt representations along with firstof function from 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

if you don't want to use xts then perhaps something like this

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM