gpt4 book ai didi

r - 计算不同时间间隔的时间戳 - 跨午夜的间​​隔问题

转载 作者:行者123 更新时间:2023-12-02 09:17:06 24 4
gpt4 key购买 nike

我有一个数据框(“观察值”),其时间戳采用 H:M 格式(“时间”)。在第二个数据帧(“间隔”)中,我有由“From”和“Till”变量定义的时间范围,也采用 H:M 格式。

我想计算每个间隔内的观测值数量。我一直在使用 data.table 中的 Between ,当包含日期时它一直工作没有任何问题。

但是,现在我只有时间戳,没有日期。这会导致午夜时间间隔 (20:00 - 05:59) 中出现的一些问题。这些次数不计入我尝试过的代码中。

下面的例子

interval.data <- data.frame(From = c("14:00", "20:00", "06:00"), Till = c("19:59", "05:59", "13:59"), stringsAsFactors = F)
observations <- data.frame(Time = c("14:32", "15:59", "16:32", "21:34", "03:32", "02:00", "00:00", "05:57", "19:32", "01:32", "02:22", "06:00", "07:50"), stringsAsFactors = F)

interval.data
# From Till
# 1: 14:00:00 19:59:00
# 2: 20:00:00 05:59:00 # <- interval including midnight
# 3: 06:00:00 13:59:00

observations
# Time
# 1: 14:32:00
# 2: 15:59:00
# 3: 16:32:00
# 4: 21:34:00 # Row 4-8 & 10-11 falls in 'midnight interval', but are not counted
# 5: 03:32:00 #
# 6: 02:00:00 #
# 7: 00:00:00 #
# 8: 05:57:00 #
# 9: 19:32:00
# 10: 01:32:00 #
# 11: 02:22:00 #
# 12: 06:00:00
# 13: 07:50:00

library(data.table)
library(plyr)
adply(interval.data, 1, function(x, y) sum(y[, 1] %between% c(x[1], x[2])), y = observations)

# From Till V1
# 1 14:00 19:59 4
# 2 20:00 05:59 0 # <- zero counts - wrong!
# 3 06:00 13:59 2

最佳答案

一种方法是在 data.table 中使用非等值连接,及其辅助函数 as.ITime 来处理时间字符串。

您可能会遇到跨越午夜的时间间隔的问题,但是,应该只存在其中一个。由于您对每“组”间隔的观察数量感兴趣,因此您可以将此组视为与其他组的“非”等效。

例如,首先将 data.frame 转换为 data.table

library(data.table)

## set your data.frames as `data.table`
setDT(interval.data)
setDT(observations)

然后使用as.ITime转换为时间的整数表示

## convert time stamps
interval.data[, `:=`(FromMins = as.ITime(From),
TillMins = as.ITime(Till))]

observations[, TimeMins := as.ITime(Time)]
## you could combine this step with the non-equi join directly, but I'm separating it for clarity

您现在可以使用非等值连接来查找每次落入的间隔。请注意,那些返回“NA”的时间实际上是那些落在午夜跨度间隔内的时间

interval.data[
observations
, on = .(FromMins <= TimeMins, TillMins > TimeMins)
]

# From Till FromMins TillMins Time
# 1: 14:00 19:59 872 872 14:32
# 2: 14:00 19:59 959 959 15.59
# 3: 14:00 19:59 992 992 16:32
# 4: NA NA 1294 1294 21:34
# 5: NA NA 212 212 03:32
# 6: NA NA 120 120 02:00
# 7: NA NA 0 0 00:00
# 8: NA NA 357 357 05:57
# 9: 14:00 19:59 1172 1172 19:32
# 10: NA NA 92 92 01:32
# 11: NA NA 142 142 02:22
# 12: 06:00 13:59 360 360 06:00
# 13: 06:00 13:59 470 470 07:50

然后,要获取间隔组的观察次数,只需按每个时间点.N 进行分组,即可将其链接到上述语句的末尾

interval.data[
observations
, on = .(FromMins <= TimeMins, TillMins > TimeMins)
][
, .N
, by = .(From, Till)
]

# From Till N
# 1: 14:00 19:59 4
# 2: NA NA 7
# 3: 06:00 13:59 2

其中 NA 组对应于跨越午夜的组

关于r - 计算不同时间间隔的时间戳 - 跨午夜的间​​隔问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45893508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com