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

Calculating differences of dates in hours between rows of a dataframe

我有以下数据框 (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

感谢@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))

假设ts1如末尾注2所示。然后从 D1 创建一个 POSIXct 变量 tt,将 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)