解析日期的函数中的奇怪行为

时间:2016-02-22 22:30:36

标签: r

我有一个函数,它接受一个日期并将其转换为矩阵中的偏移量。每15分钟的时间段内矩阵中有一行。我相信你可以更优雅或更有效地写这个,但这似乎有效,至少在大多数时候。我的问题是当我传入一个包含16个或更多日期的数组进行转换时;结果很遥远。数组15看起来很好。我尝试使其工作的事情:将偏移视为双(否),注释掉一些功能线(有时它工作,有时不工作),在函数(nope)中打印出值。显然这里有一些事情发生,但我没有尝试。是否与lubridate有关?我以前用过类似的方法没问题。代码如下,希望你可以重现这个;即使不是,请提出建议!

library(lubridate)

test15 <- structure(c(1407992400, 1407994200, 1407995100, 1407996000, 
1407996900, 1407998700, 1407999600, 1408001400, 1408002300, 1408004100, 
1408005000, 1408006800, 1408011300, 1408012200, 1408013100), 
class = c("POSIXct", "POSIXt"), tzone = "Etc/GMT+5")
test16 <- structure(c(1407992400, 1407994200, 1407995100, 1407996000, 
1407996900, 1407998700, 1407999600, 1408001400, 1408002300, 1408004100, 
1408005000, 1408006800, 1408011300, 1408012200, 1408013100, 1407987000), 
class = c("POSIXct", "POSIXt"), tzone = "Etc/GMT+5")
#---------------------------------------------------------------------------
# function to translate timestamp into time step offset
#---------------------------------------------------------------------------
study.start <- as.Date("2014-08-13")
interval <- 15

getoffset <- function(bin.in)
    { #get offset function
    date.offset <-     as.numeric(difftime(as.Date(as.POSIXlt(bin.in)),study.start))
    hour.offset <- hour(bin.in)*(60/interval)
    min.offset <- minute(bin.in)/interval
    step.offset <- date.offset*24*(60/interval) + hour.offset + min.offset
    return(step.offset)
    } #get offset function

getoffset(test15)
getoffset(test16)

1 个答案:

答案 0 :(得分:0)

此处的主要问题是,您需要在使用unit时指定difftime

getoffset <- function(bin.in,study.start,interval)
{ #get offset function
date.offset <-     as.numeric(difftime(as.Date(as.POSIXlt(bin.in)),study.start,units = "days"))
hour.offset <- hour(bin.in)*(60/interval)
min.offset <- minute(bin.in)/interval
step.offset <- date.offset*24*(60/interval) + hour.offset + min.offset
return(step.offset)
}
getoffset(test16,study.start=as.Date(as.POSIXlt("2014-08-13 00:00:00 GMT+5")),15)
[1]  96  98  99 100 101 103 104 106 107 109 110 112 117 118 119  90