-1

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

2 回答 2

2

假设ts1如最后注2所示。然后从中创建一个POSIXct变量,转换为数值,给出自纪元以来的秒数,将其除以 3600 以获得自纪元以来的小时数并取差。不使用任何包。ttD1tt

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)
于 2016-01-10T13:55:37.747 回答
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))
于 2016-01-10T13:32:16.683 回答