生成 10 Hz 的时间序列

问题描述 投票:0回答:1

我喜欢对时间序列进行插值,以便时间戳精确到 0.1 Hz。所以第一步可能是这样的

library(tidyverse) 
library(zoo)

options(digits.secs = 3, pillar.sigfig = 6)

data <- tribble(
  ~timestamp, ~value, 
  "09/12/2024 00:05:35.677", 139.664,
  "09/12/2024 00:05:35.776", 138.706,
  "09/12/2024 00:05:35.876", 143.348,
  "09/12/2024 00:05:35.975", 141.516,
  "09/12/2024 00:05:36.074", 136.731,
  "09/12/2024 00:05:36.174", 138.275,
  "09/12/2024 00:05:36.273", 143.015) %>%
  mutate(timestamp = mdy_hms(timestamp))

start <- min(data$timestamp) %>% round_date("0.1 sec")
end   <- max(data$timestamp) %>% round_date("0.1 sec")

data_10Hz <- data %>%
  complete(timestamp = seq.POSIXt(start, end, by = .100)) %>%
  arrange(timestamp) 

data_10Hz

#   timestamp                 value
#   <dttm>                    <dbl>
# 1 2024-09-12 00:05:35.677 139.664
# 2 2024-09-12 00:05:35.700  NA    
# 3 2024-09-12 00:05:35.776 138.706
# 4 2024-09-12 00:05:35.799  NA    
# 5 2024-09-12 00:05:35.875 143.348
# 6 2024-09-12 00:05:35.900  NA    
# 7 2024-09-12 00:05:35.974 141.516
# 8 2024-09-12 00:05:36.000  NA    
# 9 2024-09-12 00:05:36.073 136.731
#10 2024-09-12 00:05:36.100  NA    
#11 2024-09-12 00:05:36.174 138.275
#12 2024-09-12 00:05:36.200  NA    
#13 2024-09-12 00:05:36.273 143.015

data_10Hz <- data_10Hz  %>%
  mutate(value = na.approx(value)) %>%
  filter(timestamp == round_date(timestamp, "0.1 sec"))

data_10Hz

#   timestamp                 value
#   <dttm>                    <dbl>
# 1 2024-09-12 00:05:35.700 139.185
# 2 2024-09-12 00:05:35.799 141.027
# 3 2024-09-12 00:05:35.900 142.432
# 4 2024-09-12 00:05:36.000 139.123
# 5 2024-09-12 00:05:36.200 140.645

但这并不完全是 10 Hz(数字内部表示的问题),对于大型数据集可能会很慢。

您知道进行此类插值的有效/更清洁的方法吗?

最美好的祝愿 克里斯托夫

r time-series interpolation
1个回答
0
投票

线性插值可以使用

approx
包中的
stats
函数来完成,并且与日期时间兼容。

这能解决您的问题吗?

library(tidyverse) 

options(digits.secs = 3, pillar.sigfig = 6)

data <- tribble(
  ~timestamp, ~value, 
  "09/12/2024 00:05:35.677", 139.664,
  "09/12/2024 00:05:35.776", 138.706,
  "09/12/2024 00:05:35.876", 143.348,
  "09/12/2024 00:05:35.975", 141.516,
  "09/12/2024 00:05:36.074", 136.731,
  "09/12/2024 00:05:36.174", 138.275,
  "09/12/2024 00:05:36.273", 143.015) %>%
  mutate(timestamp = mdy_hms(timestamp))

start <- min(data$timestamp) %>% round_date("0.1 sec")
end   <- max(data$timestamp) %>% round_date("0.1 sec")

data_10_hz <- tibble(
  timestamp = seq(start, end, by = 0.1),
  value = approx(data$timestamp, data$value, timestamp)$y # interpolation with `approx`
)

data_10_hz
#> # A tibble: 6 × 2
#>   timestamp                 value
#>   <dttm>                    <dbl>
#> 1 2024-09-12 00:05:35.700 139.441
#> 2 2024-09-12 00:05:35.799 139.820
#> 3 2024-09-12 00:05:35.900 142.904
#> 4 2024-09-12 00:05:36.000 140.308
#> 5 2024-09-12 00:05:36.100 137.132
#> 6 2024-09-12 00:05:36.200 139.520

创建于 2024-09-20,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.