计算数据框行之间的日期差异(以小时为单位)
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)
我有以下数据框 (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)