在R中转换为一年中的日期和时间

在R中转换为一年中的日期和时间,r,datetime,R,Datetime,我有超过3年的数据。对于每一年,我都想找到对应于当年一月一日的日期。例如: > 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 >x#转换为一年中的某一天(朱利安日期)—— >strtime(x,“%m/%d/%Y”)$yday+1 [1] 125 365

我有超过3年的数据。对于每一年,我都想找到对应于当年一月一日的日期。例如:

> 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
>x#转换为一年中的某一天(朱利安日期)——
>strtime(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
>x1#转换为一年中的某一天(朱利安日期)——
>strtime(x1,“%m/%d/%Y%H:%m”)$yday+1
[1] 125 365   2

我希望输出以十进制天数表示,而不是这个结果。例如,第一个示例是
125.0833333
,依此类推


非常感谢你

您是否希望将一天+一天中的数字部分作为输出?如果是这样的话,类似这样的方法会奏效:

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
虽然我的蜘蛛感觉很刺痛,但德克会出现,并告诉我如何使用
POSIXct
date/time表示法来实现这一点

下面是使用基函数的一种尝试:

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

您还可以使用
POSIXct
POSIXlt
表示以及
xts
中的
firstof
函数

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

x1如果您想用另一种方法(将一年中的某一天转换为日期和时间),您可以使用以下小功能:

doy2date=函数(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),数字=0)
posixdate=as.POSIXct(粘贴(mydate,“,myh,”:”,mym,“:”,mys,sep=“”),tz=“GMT”)
返回(posixdate)
}

例如,如果您尝试:

doy2date(117.6364)


函数将以POSIXct的形式返回“2008-04-27 15:16:25 GMT”。

您希望输出是什么样的?我希望输出以十进制天数为单位。例如,第一个例子是125.0833333,以此类推。你的蜘蛛感官今天着火了@thelatemail:yoursenses'spot on。是的,正如你所说,我认为删除
+1
更有意义。非常感谢您的回答。非常感谢您的回答。@geektrader-使用gsub/as.date有什么原因吗?-我刚刚给我的答案添加了一个更简单的版本,但我很好奇我是否遗漏了什么。@Late Mail No。。只是没想到。请花点时间通读这本书。堆栈溢出上的格式设置与其他站点不同。
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
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