如何以特定的间隔规范时间序列 Dataframe

h4cxqtbf  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(74)

我有一个时间序列数据框架:

structure(list(Date_Time = structure(c(1685975396, 1685975406, 
1685975416, 1685975426, 1685975436, 1685975446, 1685975457, 1685975467, 
1685975477, 1685975487, 1685975497, 1685975507), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), `Heat Capacity` = c(-209L, 
-209L, -203L, -202L, -197L, -196L, -191L, -185L, -185L, -184L, 
-184L, -185L)), row.names = c(NA, -12L), class = c("tbl_df", 
"tbl", "data.frame"))

字符串
我试着每隔15分钟调整数据

例如:

如果Date_Time列的范围为14:26到15:26
我希望Date_Time总结如下:14:30,14:45,15:00在哪里
在每个时间戳,如14:30,热容量值应仅具有前一分钟值。范例:

Time    Heat_capacity
14:30    value at 14:29

样本数据和预期输出:

因此,2023年6月5日2:30pm的热容量值为2:29分钟的值


的数据

q0qdq0h2

q0qdq0h21#

您正在尝试使用上次观测值结转(LOCF)操作对时间序列进行重新采样。使用data.tableroll=+Inf连接可以有效地完成这一操作。(dt[dt_regular, on = "Date_Time", roll=+Inf],其中dt是您的数据,dt_regular是一个data.table,其中有一个Date_Time列,间隔为15分钟)。
考虑到你的例子:

library(data.table)
df
#>              Date_Time Heat Capacity
#> 1  2023-06-05 14:29:56          -209
#> 2  2023-06-05 14:30:06          -209
#> 3  2023-06-05 14:30:16          -203
#> 4  2023-06-05 14:30:26          -202
#> 5  2023-06-05 14:30:36          -197
#> 6  2023-06-05 14:30:46          -196
#> 7  2023-06-05 14:30:57          -191
#> 8  2023-06-05 14:31:07          -185
#> 9  2023-06-05 14:31:17          -185
#> 10 2023-06-05 14:31:27          -184
#> 11 2023-06-05 14:31:37          -184
#> 12 2023-06-05 14:31:47          -185
dt <- as.data.table(df)

# get time range of interested  rounded to full hours with a an hour of buffer
date_range <- dt[,round(range(Date_Time)+c(-60*60, 60*60) , unit="hours")]
# create 15-minute-spaced full hour aligned regular grid of time range of interest
df_regular <- data.table(Date_Time = do.call(seq, c(as.list(date_range), "15 min")))
# LOCF join into actual data ( dropping left side off buffer with `nomatch=NULL`)
dt[df_regular, ,on = "Date_Time", roll = +15*60, nomatch=NULL]
#>              Date_Time Heat Capacity
#>                 <POSc>         <int>
#> 1: 2023-06-05 14:30:00          -209
#> 2: 2023-06-05 14:45:00          -185

字符串
在这里,我们允许最大结转15分钟,以摆脱右侧的缓冲时间。如果在之前的15分钟内没有测量,则这可能导致网格时间点下降。如果这还不能满足您的需求,您需要更具体地说明您想要处理的时间范围或如何处理这些情况。
然而,您可能希望使用例如直接处理您的不等距时间点。fable或使用平均或插值代替。

sdnqo3pr

sdnqo3pr2#

您可以使用lubridate包中的round_date

lubridate::round_date(Date_Time, "15 minutes")

字符串
回合时间至满15分钟。dplyr的完整工作流程如下所示:

library(dplyr)
my Data %>% 
  mutate(Date_Time2 = lubridate::round_date(Date_Time, "15 minutes")) %>%
  group_by(Date_Time2) %>%
  mutate(
    HC = last(`Heat Capacity`)
  )

相关问题