我有超过3年的数据。每年我都希望找到与当年的Jaunary 1相对应的那一天。例如:
> 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 :(得分: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
虽然我的狡猾的感觉刺痛了Dirk会出现并告诉我如何使用POSIXct
日期/时间表示来做到这一点。
以下是使用基本功能尝试此类答案:
mapply(julian, as.POSIXct(test), paste(format(test,"%Y"),"01","01",sep="-"))
#[1] 124.083333 364.248611 1.684028
答案 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
答案 2 :(得分:0)
如果您想采取其他方法(将一年中的日期转换为日期和时间),则可以使用以下小功能:
doy2date = function(mydoy){
mydate = as.Date(mydoy,origin =“ 2008-01-01 00:00:00”,tz =“ GMT”)
dech =(mydoy-as.integer(mydoy))* 24
myh = as.integer(dech)
mym = as.integer((dech-as.integer(dech))* 60)
mys = round(I(((((dech-as.integer(dech))* 60)-mym)* 60),digits = 0)
posixdate = as.POSIXct(paste(mydate,“”,myh,“:”,mym,“:”,mys,sep =“”),tz =“ GMT”)
返回(posixdate)
}
例如,如果您尝试:
doy2date(117.6364)
该函数将以POSIXct返回“ 2008-04-27 15:16:25 GMT”。