计算数据帧行之间的日期差异(以小时为单位)

时间:2016-01-10 13:02:22

标签: r difftime

我有以下数据框(ts1):

                D1 Diff
1 20/11/2014 16:00 0.00
2 20/11/2014 17:00 0.01
3 20/11/2014 19:00 0.03

我想在ts1中添加一个新列,它将是连续行D1(日期)之间的小时数差异。

新ts1应该是:

                D1 Diff N
1 20/11/2014 16:00 0.00 
2 20/11/2014 17:00 0.01 1
3 20/11/2014 19:00 0.03 2

为了独立计算小时数,我使用:

library(lubridate)
difftime(dmy_hm("29/12/2014 11:00"), dmy_hm("29/12/2014 9:00"), units="hours") 

我知道为了计算每一行之间的差异,我需要将ts1转换成矩阵。

我使用以下命令:

> ts1$N<-difftime(dmy_hm(as.matrix(ts1$D1)), units="hours")

我得到了:

Error in as.POSIXct(time2) : argument "time2" is missing, with no default

2 个答案:

答案 0 :(得分:2)

假设ts1如末2中的注释2所示。然后从POSIXct创建一个tt变量D1,将tt转换为数字,给出自大纪元以来的秒数,将其除以3600以获得自小时以来的小时数时代和差异。没有包使用。

tt <- as.POSIXct(ts1$D1, format = "%d/%m/%Y %H:%M")
m <- transform(ts1, N = c(NA, diff(as.numeric(tt) / 3600)))

,并提供:

> m

                D1 Diff  N
1 20/11/2014 16:00 0.00 NA
2 20/11/2014 17:00 0.01  1
3 20/11/2014 19:00 0.03  2

注1:我假设您正在寻找N,以便填补空白时间。在这种情况下,您实际上并不需要N。此外,如果使用时间序列表示,处理时间序列会更容易。首先我们将ts1转换为动物园对象,然后我们创建一个零宽度动物园对象,其中包含我们需要的日期时间,最后我们合并它们:

library(zoo)
z <- read.zoo(ts1, tz = "", format = "%d/%m/%Y %H:%M")

z0 <- zoo(, seq(start(z), end(z), "hours"))
zz <- merge(z, z0)

,并提供:

> zz
2014-11-20 16:00:00 2014-11-20 17:00:00 2014-11-20 18:00:00 2014-11-20 19:00:00 
               0.00                0.01                  NA                0.03 

如果你确实需要一个数据框:

DF <- fortify.zoo(zz)

注2:以可复制的形式使用的输入是:

Lines <- "D1,Diff
1,20/11/2014 16:00,0.00
2,20/11/2014 17:00,0.01
3,20/11/2014 19:00,0.03"

ts1 <- read.csv(text = Lines, as.is = TRUE)

答案 1 :(得分:0)

感谢@David Arenburg和@nicola: 可以使用:

res <- diff(as.POSIXct(ts1$D1, format = "%d/%m/%Y %H:%M")) ; units(res) <- "hours" 

或者:

res <- diff(dmy_hm(ts1$D1))

之后:

ts1$N <- c(NA_real_, as.numeric(res))