R:如何在毫秒级重新采样日期时间变量?
R: how to resample a datetime variable at the millisecond level?
我有一个如下所示的数据框
library(dplyr)
library(lubridate)
time = c('2013-01-03 22:04:21.549', '2013-01-03 22:04:21.549', '2013-01-03 22:04:21.559', '2013-01-03 22:04:23.559' )
value = c(1,2,3,4)
data <- data_frame(time, value)
data <-data %>% mutate(time = ymd_hms(time))
# A tibble: 4 × 2
time value
<dttm> <dbl>
1 2013-01-03 22:04:21.549 1
2 2013-01-03 22:04:21.549 2
3 2013-01-03 22:04:21.559 3
4 2013-01-03 22:04:23.559 4
我想每 200 毫秒 对这个数据帧重新采样一次。
即每200毫秒取value
的平均值。
我知道可以使用 lubridate::floor_date(time, '1 second')
达到 second
精度,但不能用于 milliseconds
。
在上面的示例中,行 1
、2
和 3
应该组合在一起,而行 4
应该单独(注意它是 2
秒)。
有什么想法吗?
谢谢!
由于您使用了 [xts]
标签,这里有一个 xts 解决方案:
options(digits.secs=6)
require(xts)
x <- xts(1:4, as.POSIXct(c('2013-01-03 22:04:21.549', '2013-01-03 22:04:21.549',
'2013-01-03 22:04:21.559', '2013-01-03 22:04:23.559')))
period.apply(x, endpoints(x, "ms", 200), mean)
# [,1]
# 2013-01-03 22:04:21.559 2
# 2013-01-03 22:04:23.559 4
从您的 data
对象开始:
x <- with(data, xts(value, time))
period.apply(x, endpoints(x, "ms", 200), mean)
您对 xts 解决方案的评论要求将其 "plugged back in" 到数据框,这一事实让我认为您想要合并结果或按时间分组的列。这就是 ave
函数在 base R 中的作用。可能有一个 dplyr
等价物,但我更像是一个 base-R-guy:
编辑:
data$ms200mn <- ave(data$value,
cut( arg <- as.numeric(data$time) ,
breaks=seq( floor(arg[1]), ceil(arg[4]), by=0.2) ),
FUN=mean)
> data
# A tibble: 4 × 3
time value ms200mn
<dttm> <dbl> <dbl>
1 2013-01-03 22:04:21 1 2
2 2013-01-03 22:04:21 2 2
3 2013-01-03 22:04:21 3 2
4 2013-01-03 22:04:23 4 4
这并不真正称为 "sampling"(或重采样),而是 聚合。 seq.POSIXt
函数没有 'msec' 选项(因此需要转换为数字秒)并且不允许小数秒。
解释:
cut(arg <- as.numeric(data$time), breaks=seq( floor(arg[1]), ceil(arg[4]), by=0.2) )
它是 "classifying" 或 "categorizing" 组中的项目,这些项目由从第一个项目下方开始到最后一个项目上方结束的一系列中断定义。需要创建 arg
值,因为(由于我不明白的原因)无法使用原始 'datetime' 变量可以由 seq
函数使用。
我有一个如下所示的数据框
library(dplyr)
library(lubridate)
time = c('2013-01-03 22:04:21.549', '2013-01-03 22:04:21.549', '2013-01-03 22:04:21.559', '2013-01-03 22:04:23.559' )
value = c(1,2,3,4)
data <- data_frame(time, value)
data <-data %>% mutate(time = ymd_hms(time))
# A tibble: 4 × 2
time value
<dttm> <dbl>
1 2013-01-03 22:04:21.549 1
2 2013-01-03 22:04:21.549 2
3 2013-01-03 22:04:21.559 3
4 2013-01-03 22:04:23.559 4
我想每 200 毫秒 对这个数据帧重新采样一次。
即每200毫秒取value
的平均值。
我知道可以使用 lubridate::floor_date(time, '1 second')
达到 second
精度,但不能用于 milliseconds
。
在上面的示例中,行 1
、2
和 3
应该组合在一起,而行 4
应该单独(注意它是 2
秒)。
有什么想法吗? 谢谢!
由于您使用了 [xts]
标签,这里有一个 xts 解决方案:
options(digits.secs=6)
require(xts)
x <- xts(1:4, as.POSIXct(c('2013-01-03 22:04:21.549', '2013-01-03 22:04:21.549',
'2013-01-03 22:04:21.559', '2013-01-03 22:04:23.559')))
period.apply(x, endpoints(x, "ms", 200), mean)
# [,1]
# 2013-01-03 22:04:21.559 2
# 2013-01-03 22:04:23.559 4
从您的 data
对象开始:
x <- with(data, xts(value, time))
period.apply(x, endpoints(x, "ms", 200), mean)
您对 xts 解决方案的评论要求将其 "plugged back in" 到数据框,这一事实让我认为您想要合并结果或按时间分组的列。这就是 ave
函数在 base R 中的作用。可能有一个 dplyr
等价物,但我更像是一个 base-R-guy:
编辑:
data$ms200mn <- ave(data$value,
cut( arg <- as.numeric(data$time) ,
breaks=seq( floor(arg[1]), ceil(arg[4]), by=0.2) ),
FUN=mean)
> data
# A tibble: 4 × 3
time value ms200mn
<dttm> <dbl> <dbl>
1 2013-01-03 22:04:21 1 2
2 2013-01-03 22:04:21 2 2
3 2013-01-03 22:04:21 3 2
4 2013-01-03 22:04:23 4 4
这并不真正称为 "sampling"(或重采样),而是 聚合。 seq.POSIXt
函数没有 'msec' 选项(因此需要转换为数字秒)并且不允许小数秒。
解释:
cut(arg <- as.numeric(data$time), breaks=seq( floor(arg[1]), ceil(arg[4]), by=0.2) )
它是 "classifying" 或 "categorizing" 组中的项目,这些项目由从第一个项目下方开始到最后一个项目上方结束的一系列中断定义。需要创建 arg
值,因为(由于我不明白的原因)无法使用原始 'datetime' 变量可以由 seq
函数使用。