R语言 是否有一个difftime()版本的向量?

9vw9lbht  于 2023-05-11  发布在  其他
关注(0)|答案(3)|浏览(81)

我有日期时间向量与相当不同的条目。有时条目之间的间隔只有几秒钟,有时是几天。就像这样:

# Vector increasing by seconds
time1 <- ymd_hms(c("2023-05-02 14:15:00", "2023-05-02 14:15:01", "2023-05-02 14:15:02"))
# Vector increasing by days
time2 <- ymd_hms(c("2023-05-02 14:15:00", "2023-05-03 14:15:00", "2023-05-04 14:15:00"))

我需要知道所有向量的时差。diff()的问题是它会自动选择一个时间单位,我们不能设置自己的单位(没有unit参数):

diff(time1) == diff(time2)
# TRUE

幸运的是,difftime()函数有一个unit参数。但是difftime的问题是它不接受向量:

difftime(time1)
# Error in difftime(time1) : argument "time2" is missing, with no default

有没有一个函数可以计算整个矢量的差异,我们可以在其中设置单位?我猜还有比sapply(seq(1, length(time1)-1, 1), function(i){difftime(time1[i+1], time1[i], units= "sec")})更优雅的方法吗?

2izufjch

2izufjch1#

在base R中,as.numeric函数接受一个units =参数,您可以与diff()一起使用,以提供输出的灵活性:

# time 1, in seconds
as.numeric(diff(time1), units = "secs")
# [1] 1 1
as.numeric(diff(time1), units = "days")
# [1] 1.157407e-05 1.157407e-05

# time 2, in days
as.numeric(diff(time2), units = "days")
# [1] 1 1
as.numeric(diff(time2), units = "secs")
# [1] 86400 86400
iezvtpos

iezvtpos2#

如果你想要更大的灵活性,你可以使用我的函数time_diff(),它使用lubridate来支持周期时间差和通常的持续时间差。

# remotes::install_github("NicChr/timeplyr")
library(timeplyr)
library(dplyr)
library(lubridate)

tdiff <- function(x, n = 1, ...){
  out <- time_diff(dplyr::lag(x, n = n), x, ...)
  tail(out, n = -n)
}

tdiff(time1, by = "sec", n = 1)
#> [1] 1 1
# Period or duration differences
tdiff(time1, by = "month", type = "period")
#> [1] 3.733572e-07 3.733572e-07
tdiff(time1, by = "month", type = "duration")
#> [1] 3.802571e-07 3.802571e-07

创建于2023-05-04使用reprex v2.0.2

syqv5f0l

syqv5f0l3#

是的,你可以通过指定time1和time2参数作为相同长度的向量来使用difftime()函数。要使用特定单位计算时差,可以将units参数设置为所需单位。

相关问题