【问题标题】:Selecting specific times in a time series based on other column values根据其他列值选择时间序列中的特定时间
【发布时间】:2021-07-16 10:26:20
【问题描述】:

我已经在一个时间序列中连续测量了罐子中的土壤排放量,现在我想删减一些测量值,以便我只有最后一次测量时间段。

我有一个包含三列的数据集:timejarmeasurement_type。我想剪掉第一行,这样我就得到了最后 12 分钟测量的罐子。 当我测量了一个罐子的最后 12 分钟时,我想剪掉最后测量的两分钟,所以我最终对每个罐子进行了 10 分钟的测量。

有什么想法可以顺利解决这个问题吗?

这是数据:

df <- structure(list(time = c("2021-04-02 23:40:20", "2021-04-02 23:41:15", 
"2021-04-02 23:42:10", "2021-04-02 23:43:05", "2021-04-02 23:44:55", 
"2021-04-02 23:45:50", "2021-04-02 23:46:45", "2021-04-02 23:47:40", 
"2021-04-02 23:48:35", "2021-04-02 23:49:30", "2021-04-02 23:50:25", 
"2021-04-02 23:52:15", "2021-04-02 23:53:10", "2021-04-02 23:54:05", 
"2021-04-02 23:55:00", "2021-04-02 23:55:55", "2021-04-02 23:56:50", 
"2021-04-02 23:57:45", "2021-04-02 23:58:40", "2021-04-03 00:00:30", 
"2021-04-03 00:01:25", "2021-04-03 00:02:20", "2021-04-03 00:03:15", 
"2021-04-03 00:04:10", "2021-04-03 00:06:00", "2021-04-03 00:06:55", 
"2021-04-03 00:07:50", "2021-04-03 00:08:45", "2021-04-03 00:09:40", 
"2021-04-03 00:10:35", "2021-04-03 00:11:30", "2021-04-03 00:13:20", 
"2021-04-03 00:14:15", "2021-04-03 00:15:10", "2021-04-03 00:16:05", 
"2021-04-03 00:17:55", "2021-04-03 00:18:50", "2021-04-03 00:19:45", 
"2021-04-03 00:20:40", "2021-04-03 00:22:30", "2021-04-03 00:23:25", 
"2021-04-03 00:24:20", "2021-04-03 00:26:10", "2021-04-03 00:27:05", 
"2021-04-03 00:28:00", "2021-04-03 00:28:55", "2021-04-03 00:30:45", 
"2021-04-03 00:31:40", "2021-04-03 00:32:35", "2021-04-03 00:34:25", 
"2021-04-03 00:35:20", "2021-04-03 00:36:15", "2021-04-03 00:37:10", 
"2021-04-03 00:39:00", "2021-04-03 00:39:55", "2021-04-03 00:40:50", 
"2021-04-03 00:41:45", "2021-04-03 00:43:35", "2021-04-03 00:44:30", 
"2021-04-03 00:45:25", "2021-04-03 00:47:15", "2021-04-03 00:48:10", 
"2021-04-03 00:49:05", "2021-04-03 00:50:00", "2021-04-03 00:50:55", 
"2021-04-03 00:51:50", "2021-04-03 00:52:45", "2021-04-03 00:53:40", 
"2021-04-03 00:55:30", "2021-04-03 00:56:25", "2021-04-03 00:57:20", 
"2021-04-03 00:58:15", "2021-04-03 00:59:10", "2021-04-03 01:00:05", 
"2021-04-03 01:01:00", "2021-04-03 01:02:50", "2021-04-03 01:03:45", 
"2021-04-03 01:04:40", "2021-04-03 01:05:35", "2021-04-03 01:06:30", 
"2021-04-03 01:07:25", "2021-04-03 01:08:20", "2021-04-03 01:09:15", 
"2021-04-03 01:10:10", "2021-04-03 01:11:05", "2021-04-03 01:11:59", 
"2021-04-03 01:13:49", "2021-04-03 01:14:44", "2021-04-03 01:15:39", 
"2021-04-03 01:17:29", "2021-04-03 01:18:24", "2021-04-03 01:19:19", 
"2021-04-03 01:20:14", "2021-04-03 01:21:09", "2021-04-03 01:22:04", 
"2021-04-03 01:22:59", "2021-04-03 01:23:54", "2021-04-03 01:24:49", 
"2021-04-03 01:25:44", "2021-04-03 01:26:39", "2021-04-03 01:28:29", 
"2021-04-03 01:29:24", "2021-04-03 01:30:19", "2021-04-03 01:31:14", 
"2021-04-03 01:32:09", "2021-04-03 01:33:04", "2021-04-03 01:33:59", 
"2021-04-03 01:35:49", "2021-04-03 01:36:44", "2021-04-03 01:37:39", 
"2021-04-03 01:38:34", "2021-04-03 01:39:29", "2021-04-03 01:40:24", 
"2021-04-03 01:42:14", "2021-04-03 01:43:09", "2021-04-03 01:44:04", 
"2021-04-03 01:44:59", "2021-04-03 01:45:54", "2021-04-03 01:46:49", 
"2021-04-03 01:47:44", "2021-04-03 01:48:39", "2021-04-03 01:49:34", 
"2021-04-03 01:50:29", "2021-04-03 01:51:24", "2021-04-03 01:52:19", 
"2021-04-03 01:53:14", "2021-04-03 01:54:09", "2021-04-03 01:55:59", 
"2021-04-03 01:56:54", "2021-04-03 01:57:49", "2021-04-03 01:58:44", 
"2021-04-03 01:59:39", "2021-04-03 02:00:34", "2021-04-03 02:01:29", 
"2021-04-03 02:03:19", "2021-04-03 02:04:14", "2021-04-03 02:05:09", 
"2021-04-03 02:06:04", "2021-04-03 02:06:59", "2021-04-03 02:07:54", 
"2021-04-03 02:08:49", "2021-04-03 02:09:44", "2021-04-03 02:11:34", 
"2021-04-03 02:12:29", "2021-04-03 02:13:24", "2021-04-03 02:14:19", 
"2021-04-03 02:15:14", "2021-04-03 02:16:09", "2021-04-03 02:17:04", 
"2021-04-03 02:18:54", "2021-04-03 02:19:49", "2021-04-03 02:20:44", 
"2021-04-03 02:21:39", "2021-04-03 02:22:34", "2021-04-03 02:23:29", 
"2021-04-03 02:24:24", "2021-04-03 02:25:19", "2021-04-03 02:26:14", 
"2021-04-03 02:27:09", "2021-04-03 02:28:04", "2021-04-03 02:28:59", 
"2021-04-03 02:29:54", "2021-04-03 02:30:49", "2021-04-03 02:31:44", 
"2021-04-03 02:32:39", "2021-04-03 02:33:34", "2021-04-03 02:34:29", 
"2021-04-03 02:35:24", "2021-04-03 02:36:19", "2021-04-03 02:37:14", 
"2021-04-03 02:38:09", "2021-04-03 02:39:04", "2021-04-03 02:39:59", 
"2021-04-03 02:40:54", "2021-04-03 02:41:49", "2021-04-03 02:42:44", 
"2021-04-03 02:43:39", "2021-04-03 02:44:34", "2021-04-03 02:45:29", 
"2021-04-03 02:46:24", "2021-04-03 02:47:19", "2021-04-03 02:48:14", 
"2021-04-03 02:49:09", "2021-04-03 02:50:04", "2021-04-03 02:50:59", 
"2021-04-03 02:51:54", "2021-04-03 02:52:49", "2021-04-03 02:53:44", 
"2021-04-03 02:54:39", "2021-04-03 02:55:34", "2021-04-03 02:56:29", 
"2021-04-03 02:57:24", "2021-04-03 02:58:19", "2021-04-03 02:59:14", 
"2021-04-03 03:00:09", "2021-04-03 03:01:04", "2021-04-03 03:01:59", 
"2021-04-03 03:02:54", "2021-04-03 03:03:49", "2021-04-03 03:04:44", 
"2021-04-03 03:05:39", "2021-04-03 03:06:34", "2021-04-03 03:07:29", 
"2021-04-03 03:08:24", "2021-04-03 03:09:19", "2021-04-03 03:10:14", 
"2021-04-03 03:11:09", "2021-04-03 03:12:04", "2021-04-03 03:12:59", 
"2021-04-03 03:13:54", "2021-04-03 03:14:49", "2021-04-03 03:15:44", 
"2021-04-03 03:16:39", "2021-04-03 03:17:34", "2021-04-03 03:18:29", 
"2021-04-03 03:19:24", "2021-04-03 03:20:19", "2021-04-03 03:21:14", 
"2021-04-03 03:22:09", "2021-04-03 03:23:04", "2021-04-03 03:23:59"
), jar = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L
), measurement_type = c("a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", 
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", 
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", 
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", 
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", 
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", 
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", 
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", 
"b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", 
"b", "b", "b", "b", "b")), class = "data.frame", row.names = c(NA, 
-221L))

这是我期望 jar 1 的样子:

expected_df <- structure(list(time = c("2021-04-02 23:57:45", "2021-04-02 23:58:40", 
"2021-04-03 00:00:30", "2021-04-03 00:01:25", "2021-04-03 00:02:20", 
"2021-04-03 00:03:15", "2021-04-03 00:04:10", "2021-04-03 00:06:00", 
"2021-04-03 00:06:55", "2021-04-03 00:53:40", "2021-04-03 00:55:30", 
"2021-04-03 00:56:25", "2021-04-03 00:57:20", "2021-04-03 00:58:15", 
"2021-04-03 00:59:10", "2021-04-03 01:00:05", "2021-04-03 01:01:00", 
"2021-04-03 01:02:50"), jar = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), measurement_type = c("a", 
"a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", 
"a", "a", "a", "a")), class = "data.frame", row.names = c(NA, 
-18L))

【问题讨论】:

  • 您想要每组的最后九行吗?对吗?
  • 这可能是一个在大多数情况下对我有用的选项是的。除了我不想要最后两行

标签: r tidyverse


【解决方案1】:

您似乎只使用时间,而忽略了日期。如果是这样,您可以使用data.table 中的ITime(或者您可以将日期设置为相同的日期),以便比较时间。

在这种情况下,如果要处理每个jarmeasurement_type 组合,请使用group_by,然后根据时间使用filter。由于时间以秒为单位,我乘以 60 为分钟,参考最新(或max)时间。

添加最后一个filter 只是为了重现与帖子中相同的结果,可以将其删除。

library(tidyverse)
library(data.table)

df %>%
  mutate(time_only = as.ITime(time)) %>%
  group_by(jar, measurement_type) %>%
  filter(time_only > max(time_only) - (60 * 12),
         time_only < max(time_only) - (60 * 2)) %>%
  filter(jar == 1, measurement_type == "a")

输出

   time                  jar measurement_type time_only
   <chr>               <int> <chr>            <ITime>  
 1 2021-06-06 12:35:45     1 a                12:35:45 
 2 2021-06-15 12:36:30     1 a                12:36:30 
 3 2021-06-18 12:36:45     1 a                12:36:45 
 4 2021-06-24 12:37:15     1 a                12:37:15 
 5 2021-06-26 12:37:25     1 a                12:37:25 
 6 2021-06-29 12:37:40     1 a                12:37:40 
 7 2021-07-06 12:38:15     1 a                12:38:15 
 8 2021-07-12 12:38:45     1 a                12:38:45 
 9 2021-07-21 12:39:30     1 a                12:39:30 
10 2021-08-05 12:40:45     1 a                12:40:45 
11 2021-08-29 12:42:45     1 a                12:42:45 
12 2021-09-08 12:43:35     1 a                12:43:35 
13 2021-09-14 12:44:05     1 a                12:44:05 
14 2021-09-22 12:44:45     1 a                12:44:45

【讨论】:

  • 感谢您的评论@Ben!事实上,在某些情况下,日期很重要。我已经编辑了我的问题中的数据。
【解决方案2】:

数据和预期输出不一致?虽然这里是一个尝试。不确定measurement_type 是否应该在group 定义中。

过滤记录将介于最大时间的-12 min 和最大时间的-2 min 之间。

library(dplyr)

df %>% 
  mutate(time = as.POold_records_updatedSIXct(time, format = "%Y-%m-%d %H:%M:%S")) %>%
  group_by(jar, measurement_type) %>%
  # Calculate max_time of the group of jar & measurment_type
  mutate(max_time = max(time)) %>%
  filter(
    # filter time that later than max_time - 12 min
    time >= seq.POSIXt(from = first(max_time), by = "-12 min", length.out = 2)[2],
    # filter time that before max_time - 2 min
    time <= seq.POSIXt(from = first(max_time), by = "-2 min", length.out = 2)[2])
#> # A tibble: 60 x 4
#> # Groups:   jar, measurement_type [6]
#>    time                  jar measurement_type max_time           
#>    <dttm>              <int> <chr>            <dttm>             
#>  1 2021-04-02 23:55:00     1 a                2021-04-03 00:06:55
#>  2 2021-04-02 23:55:55     1 a                2021-04-03 00:06:55
#>  3 2021-04-02 23:56:50     1 a                2021-04-03 00:06:55
#>  4 2021-04-02 23:57:45     1 a                2021-04-03 00:06:55
#>  5 2021-04-02 23:58:40     1 a                2021-04-03 00:06:55
#>  6 2021-04-03 00:00:30     1 a                2021-04-03 00:06:55
#>  7 2021-04-03 00:01:25     1 a                2021-04-03 00:06:55
#>  8 2021-04-03 00:02:20     1 a                2021-04-03 00:06:55
#>  9 2021-04-03 00:03:15     1 a                2021-04-03 00:06:55
#> 10 2021-04-03 00:04:10     1 a                2021-04-03 00:06:55
#> # … with 50 more rows

reprex package (v2.0.0) 于 2021-04-23 创建

【讨论】:

    【解决方案3】:

    与其他回答过这个问题的人类似,我也不确定我是否正确理解了这个问题。我想你想要的可以通过slice_head()slice_tail这样得到!

    df %>% group_by(measurement_type, jar) %>%
      arrange(time) %>%
      slice_tail(n = 12) %>%
      slice_head(n = 10)
    
    # A tibble: 60 x 3
    # Groups:   measurement_type, jar [6]
       time                  jar measurement_type
       <chr>               <int> <chr>           
     1 2021-04-02 23:55:00     1 a               
     2 2021-04-02 23:55:55     1 a               
     3 2021-04-02 23:56:50     1 a               
     4 2021-04-02 23:57:45     1 a               
     5 2021-04-02 23:58:40     1 a               
     6 2021-04-03 00:00:30     1 a               
     7 2021-04-03 00:01:25     1 a               
     8 2021-04-03 00:02:20     1 a               
     9 2021-04-03 00:03:15     1 a               
    10 2021-04-03 00:04:10     1 a               
    # ... with 50 more rows
    
    • slice_tailn = 12 将为您提供每组的最后 12 行
    • slice_headn =10 将为您提供上一个输出的前 10 行,从而删除最后两行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 2018-09-24
      • 2021-02-09
      • 2021-09-18
      • 2019-05-06
      相关资源
      最近更新 更多