计算 R 中两个时间戳之间的差异; NA 与时差输出一起出现
Calculating difference between two timestamps in R; NA appears alongside time difference output
我正在计算数据帧中两个时间戳之间的小时差。一个时间戳在前一行,即 lasttime
,另一个在前一行,即 origtime
。这是一个小例子:-
library(dplyr)
df<-structure(list(DateTime_Start = structure(c(1612284131.736, 1612296614.851
), tzone = "UTC", class = c("POSIXct", "POSIXt")), DateTime_End = structure(c(1612284195.736,
1612296715.851), tzone = "UTC", class = c("POSIXct", "POSIXt"
))), row.names = c(NA, -2L), class = "data.frame")
df
# DateTime_Start DateTime_End
#1 2021-02-02 16:42:11 2021-02-02 16:43:15
#2 2021-02-02 20:10:14 2021-02-02 20:11:55
lasttime<-lag(df$DateTime_End)
lasttime
#[1] NA "2021-02-02 16:43:15 UTC"
origtime<-lead(df$DateTime_Start)
origtime
#[1] "2021-02-02 20:10:14 UTC" NA
您可以注意到 returns lasttime
和 origtime
的每个 运行 旁边的一个 NA,似乎是另一个时间戳的占位符df
内的行。然后当我尝试计算 difftime
时,我得到这个:-
difftime(origtime,lastime)
#Time differences in secs
#[1] NA NA
我认为这是由 origtime
和 lasttime
中的 NA
引起的。谁能指出一个解决方案来区分这两个日期时间对象?
非常感谢!
Lag 和 Lead 正在查找之前和未来的时间戳。如果没有,那么他们 return NA。如果那不是您想要的行为,您想要什么行为?
您有 4 个时间戳。我完全不知道你想用什么来计算差异!
您是否要计算第一个开始时间和最后一个结束时间之间的差异?
difftime(min(df$DateTime_Start), max(df$DateTime_End))
如果您向数据中添加第三行,您会得到中间行的 difftime。添加 200 行,您将获得 200 个结果和两个 NA。
默认情况下,lag
的第一个值和 lead
的最后一个值始终为 NA
。由于 lag
中第一行没有前一个值,lead
中最后一行没有下一个值。
您需要更改 default
值以获得不是 NA
的值。例如,要获得 0 作为第一个值,您可以执行 -
library(dplyr)
df %>%
mutate(difference = difftime(DateTime_Start, lag(DateTime_End, default = first(DateTime_Start)), units = 'hours'))
# DateTime_Start DateTime_End difference
#1 2021-02-02 16:42:11 2021-02-02 16:43:15 0.000000 hours
#2 2021-02-02 20:10:14 2021-02-02 20:11:55 3.449754 hours
在第二行中,您正在计算 DateTime_Start[2] - DateTime_End[1]
。如果您在第 3 行中有超过 2 行,您将获得 DateTime_Start[3] - DateTime_End[2]
等的输出。
我正在计算数据帧中两个时间戳之间的小时差。一个时间戳在前一行,即 lasttime
,另一个在前一行,即 origtime
。这是一个小例子:-
library(dplyr)
df<-structure(list(DateTime_Start = structure(c(1612284131.736, 1612296614.851
), tzone = "UTC", class = c("POSIXct", "POSIXt")), DateTime_End = structure(c(1612284195.736,
1612296715.851), tzone = "UTC", class = c("POSIXct", "POSIXt"
))), row.names = c(NA, -2L), class = "data.frame")
df
# DateTime_Start DateTime_End
#1 2021-02-02 16:42:11 2021-02-02 16:43:15
#2 2021-02-02 20:10:14 2021-02-02 20:11:55
lasttime<-lag(df$DateTime_End)
lasttime
#[1] NA "2021-02-02 16:43:15 UTC"
origtime<-lead(df$DateTime_Start)
origtime
#[1] "2021-02-02 20:10:14 UTC" NA
您可以注意到 returns lasttime
和 origtime
的每个 运行 旁边的一个 NA,似乎是另一个时间戳的占位符df
内的行。然后当我尝试计算 difftime
时,我得到这个:-
difftime(origtime,lastime)
#Time differences in secs
#[1] NA NA
我认为这是由 origtime
和 lasttime
中的 NA
引起的。谁能指出一个解决方案来区分这两个日期时间对象?
非常感谢!
Lag 和 Lead 正在查找之前和未来的时间戳。如果没有,那么他们 return NA。如果那不是您想要的行为,您想要什么行为?
您有 4 个时间戳。我完全不知道你想用什么来计算差异!
您是否要计算第一个开始时间和最后一个结束时间之间的差异?
difftime(min(df$DateTime_Start), max(df$DateTime_End))
如果您向数据中添加第三行,您会得到中间行的 difftime。添加 200 行,您将获得 200 个结果和两个 NA。
默认情况下,lag
的第一个值和 lead
的最后一个值始终为 NA
。由于 lag
中第一行没有前一个值,lead
中最后一行没有下一个值。
您需要更改 default
值以获得不是 NA
的值。例如,要获得 0 作为第一个值,您可以执行 -
library(dplyr)
df %>%
mutate(difference = difftime(DateTime_Start, lag(DateTime_End, default = first(DateTime_Start)), units = 'hours'))
# DateTime_Start DateTime_End difference
#1 2021-02-02 16:42:11 2021-02-02 16:43:15 0.000000 hours
#2 2021-02-02 20:10:14 2021-02-02 20:11:55 3.449754 hours
在第二行中,您正在计算 DateTime_Start[2] - DateTime_End[1]
。如果您在第 3 行中有超过 2 行,您将获得 DateTime_Start[3] - DateTime_End[2]
等的输出。