【问题标题】:How to create a unique index based on chunks of time如何根据时间块创建唯一索引
【发布时间】:2021-10-19 18:02:41
【问题描述】:

我希望可以为 R 中的时间段创建唯一索引或 ID。

我有一个二级时间数据的大型数据集。理论上,有时间中断可以让我将时间块“分组”并为它们分配一个唯一的索引或编号。

我将尝试创建一个可重现的示例,但请记住,时间的持续时间以块为单位发生变化,时间间隔不均匀,日期可能会从一天变为另一天。

#this is what the dataframe would look like

DateTime
2021-07-12 20:28:26 CDT
2021-07-12 20:28:27 CDT
2021-07-12 20:28:28 CDT
2021-07-12 20:28:29 CDT
2021-07-12 20:28:30 CDT
2021-07-12 23:14:28 CDT
2021-07-12 23:14:29 CDT
2021-07-12 23:14:30 CDT
2021-07-12 23:14:31 CDT
2021-07-12 23:14:32 CDT
2021-07-12 23:14:33 CDT
2021-07-12 23:14:34 CDT
2021-07-12 23:14:35 CDT
2021-07-12 23:14:36 CDT
2021-07-27 17:16:05 CDT
2021-07-27 17:16:06 CDT
2021-07-27 17:16:07 CDT
2021-07-27 17:16:08 CDT
2021-07-27 17:16:09 CDT
2021-07-27 17:16:10 CDT
2021-07-27 17:16:11 CDT
2021-07-27 17:16:12 CDT
2021-07-27 17:16:13 CDT
2021-07-27 17:16:14 CDT
2021-07-27 17:16:15 CDT


#this is for reproducing time times
structure(c(1626139706, 1626139707, 1626139708, 1626139709, 1626139710, 1626149668, 1626149669, 1626149670, 1626149671, 1626149672, 1626149673, 1626149674, 1626149675, 1626149676, 1627424165, 1627424166, 1627424167, 1627424168, 1627424169, 1627424170, 1627424171, 1627424172, 1627424173, 1627424174, 1627424175), 
class = c("POSIXct", "POSIXt"), tzone = "")

再次,我希望为时间段/块分配一个唯一编号。如下所示:

DateTime                 Index
2021-07-12 20:28:26 CDT     1
2021-07-12 20:28:27 CDT     1
2021-07-12 20:28:28 CDT     1
2021-07-12 20:28:29 CDT     1
2021-07-12 20:28:30 CDT     1
2021-07-12 23:14:28 CDT     2
2021-07-12 23:14:29 CDT     2
2021-07-12 23:14:30 CDT     2
2021-07-12 23:14:31 CDT     2
2021-07-12 23:14:32 CDT     2
2021-07-12 23:14:33 CDT     2
2021-07-12 23:14:34 CDT     2
2021-07-12 23:14:35 CDT     2
2021-07-12 23:14:36 CDT     2
2021-07-27 17:16:05 CDT     3
2021-07-27 17:16:06 CDT     3
2021-07-27 17:16:07 CDT     3
2021-07-27 17:16:08 CDT     3
2021-07-27 17:16:09 CDT     3
2021-07-27 17:16:10 CDT     3
2021-07-27 17:16:11 CDT     3
2021-07-27 17:16:12 CDT     3
2021-07-27 17:16:13 CDT     3
2021-07-27 17:16:14 CDT     3
2021-07-27 17:16:15 CDT     3

#edit: something like this is possibility but isn't included in the reproducible example.

DateTime                 Index
2021-07-15 23:59:59 CDT     4
2021-07-16 00:00:00 CDT     4

这是我找到的最接近我正在寻找的东西:How do I create a unique ID for each night-time period across consecutive dates?

但我不确定如何继续。任何帮助将不胜感激谢谢。

【问题讨论】:

  • 这种情况是不是你可以想象一个规则,比如“自上次以来每次间隔> 1分钟的新组”或“每次间隔是平均间隔的 10 倍时新组”最后 5 个条目”?
  • 你需要library(lubridate); tibble(DateTime) %>% mutate(Index =floor_date(DateTime, unit = 'hour'), Index = match(Index, unique(Index)))
  • @Jon Spring - 是的,类似于您的第一个建议。像“每次间隔 > 1 分钟的新组”这样的规则会起作用。我相信在我的整个数据集中,时间间隔应该相差很远,比如一个小时,但可能会有一些异常。

标签: r indexing grouping


【解决方案1】:

这是另一种方法:

library(dplyr)

tibble(DateTime) %>% 
  mutate(DateTime1 = lag(DateTime, default = DateTime[1])) %>% 
  mutate(helper = DateTime - DateTime1) %>% 
  group_by(Index = cumsum(helper!=1)) %>% 
  select(-DateTime1, -helper)

数据:

DateTime <- structure(c(1626139706, 1626139707, 1626139708, 1626139709, 1626139710, 1626149668, 1626149669, 1626149670, 1626149671, 1626149672, 1626149673, 1626149674, 1626149675, 1626149676, 1627424165, 1627424166, 1627424167, 1627424168, 1627424169, 1627424170, 1627424171, 1627424172, 1627424173, 1627424174, 1627424175), 
          class = c("POSIXct", "POSIXt"), tzone = "")

输出:

DateTime            Index
   <dttm>              <int>
 1 2021-07-13 03:28:26     1
 2 2021-07-13 03:28:27     1
 3 2021-07-13 03:28:28     1
 4 2021-07-13 03:28:29     1
 5 2021-07-13 03:28:30     1
 6 2021-07-13 06:14:28     2
 7 2021-07-13 06:14:29     2
 8 2021-07-13 06:14:30     2
 9 2021-07-13 06:14:31     2
10 2021-07-13 06:14:32     2
11 2021-07-13 06:14:33     2
12 2021-07-13 06:14:34     2
13 2021-07-13 06:14:35     2
14 2021-07-13 06:14:36     2
15 2021-07-28 00:16:05     3
16 2021-07-28 00:16:06     3
17 2021-07-28 00:16:07     3
18 2021-07-28 00:16:08     3
19 2021-07-28 00:16:09     3
20 2021-07-28 00:16:10     3
21 2021-07-28 00:16:11     3
22 2021-07-28 00:16:12     3
23 2021-07-28 00:16:13     3
24 2021-07-28 00:16:14     3
25 2021-07-28 00:16:15     3

【讨论】:

    【解决方案2】:
    library(dplyr)
    data.frame(DateTime) %>%
      mutate(Index = 1 + cumsum(DateTime - lag(DateTime,1,min(DateTime)) > 60))
    

    这将在每次休息 1 分钟或更长时间时创建一个新组。日期时间“在后台”存储为秒,因此与先前(“滞后”)值相差 60 分钟是一分钟。 cumsum 正在捕获发生大中断的累计次数。

                  DateTime Index
    1  2021-07-12 18:28:26     1
    2  2021-07-12 18:28:27     1
    3  2021-07-12 18:28:28     1
    4  2021-07-12 18:28:29     1
    5  2021-07-12 18:28:30     1
    6  2021-07-12 21:14:28     2
    7  2021-07-12 21:14:29     2
    8  2021-07-12 21:14:30     2
    9  2021-07-12 21:14:31     2
    10 2021-07-12 21:14:32     2
    11 2021-07-12 21:14:33     2
    12 2021-07-12 21:14:34     2
    13 2021-07-12 21:14:35     2
    14 2021-07-12 21:14:36     2
    15 2021-07-27 15:16:05     3
    16 2021-07-27 15:16:06     3
    17 2021-07-27 15:16:07     3
    18 2021-07-27 15:16:08     3
    19 2021-07-27 15:16:09     3
    20 2021-07-27 15:16:10     3
    21 2021-07-27 15:16:11     3
    22 2021-07-27 15:16:12     3
    23 2021-07-27 15:16:13     3
    24 2021-07-27 15:16:14     3
    25 2021-07-27 15:16:15     3
    

    【讨论】:

      【解决方案3】:

      如果我们正在寻找每分钟变化增加1的索引,那么可以使用floor_date

      library(lubridate)
      library(tibble)
      library(dplyr)
      tibble(DateTime) %>% 
         mutate(Index =floor_date(DateTime, unit = 'minute'),
            Index = match(Index, unique(Index)))
      

      -输出

      # A tibble: 25 × 2
         DateTime            Index
         <dttm>              <int>
       1 2021-07-12 21:28:26     1
       2 2021-07-12 21:28:27     1
       3 2021-07-12 21:28:28     1
       4 2021-07-12 21:28:29     1
       5 2021-07-12 21:28:30     1
       6 2021-07-13 00:14:28     2
       7 2021-07-13 00:14:29     2
       8 2021-07-13 00:14:30     2
       9 2021-07-13 00:14:31     2
      10 2021-07-13 00:14:32     2
      # … with 15 more rows
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-10
        • 2018-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        相关资源
        最近更新 更多