5

我有超过 3 年的数据。对于每一年,我都想找到对应于当年 1 月 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等等。

非常感谢。

4

3 回答 3

9

您是否希望将一天 + 一天的数字部分作为输出?如果是这样,这样的事情将起作用:

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
于 2013-03-19T02:57:26.897 回答
9

您还可以使用POSIXctPOSIXlt表示以及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
于 2013-03-19T03:08:18.123 回答
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)

该函数将返回“2008-04-27 15:16:25 GMT”作为 POSIXct。

于 2019-09-17T16:42:05.223 回答