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