【问题标题】:Select and filter data data from 03:00 am to 03:00 am next day选择并过滤从凌晨 03:00 到次日凌晨 03:00 的数据数据
【发布时间】:2020-06-15 22:20:40
【问题描述】:

我正在尝试为日期和 id 的每个组合(凌晨 3 点到第二天凌晨 3 点)查找在 03:00:00 和第二天 03:00:00 之间发生的第一个“ON”记录。

    #dummy data
df <- tibble::tribble(
       ~id, ~code, ~start_day, ~hhmmss,       ~end_time,
  "7050-1",               "ON",   20200227,      "000000", 20200227002400,
  "7050-1",             "SNOOZE",   20200227,        "002400", 20200227003400,
  "7050-1",              "OFF",   20200227,        "003400", 20200227003545,
  "7050-1",               "ON",   20200227,        "003545", 20200227004815,
  "7050-1",             "SLP",   20200227,        "004815", 20200227021400,
  "7050-1",             "SLP",   20200227,       "021400", 20200227073415,
  "7050-1",               "ON",   20200227,       "073415", 20200227164515,
  "7050-1",               "ON",   20200228,      "025936", 20200227045936,
   "265-1",               "ON",   20200227,      "000000", 20200227002400,
   "265-1",             "SNOOZE",   20200227,      "164515", 20200227165515,
   "265-1",              "OFF",   20200227,      "165515", 20200228025936,
   "265-1",               "ON",   20200228,      "023536", 20200228025536,
  "265-1",               "OFF",   20200228,      "025536", 20200228003000,
  "265-1",               "ON",   20200228,       "03000", 20200228035936,
  "265-2",               "OFF",   20200228,      "000000", 20200228180000,
  "265-2",               "OFF",   20200228,      "180000", 20200228235959,
  "265-2",               "ON",   20200229,       "000000", 20200229020000,
  )

这是我目前的尝试

df %>%
  mutate(
    time = format(strptime(hhmmss, format = "%H%M%S"), format = "%H:%M:%S"),
    time = hms::as.hms(time, format = "%H:%M:%S") ,
    date = ymd(start_day) ) %>%
  group_by(date,id) %>%
  filter(time >= hms::as.hms("02:59:59", format = "%H:%M:%S") & code == "ON")

但我不应该使用这样的过滤器,因为我丢失了265-2record。这是我的愿望输出。 (** 265-2 记录发生在班次 28-02-28 03:00:00 和 28-02-29 03:00:00 之间,并且应该分配给日期 28/02 而不是 29/02 。希望很清楚

  id     code  date   time        

 7050-1 ON     20200227     07:34:15 
 265-1  ON     20200228     03:00:00 
 265-2  ON     20200228     00:00:00 

【问题讨论】:

    标签: r datetime time lubridate


    【解决方案1】:

    idk,可能我没看懂你的逻辑,希望对你有帮助

    df %>% 
       mutate(date = ymd(start_day),
              time = format(strptime(hhmmss, format = "%H%M%S"), format = "%H:%M:%S"),
              time = hms::as.hms(time, format = "%H:%M:%S")) %>% 
       mutate(new_date = as_datetime(glue::glue('{date} {time}')) - hours(3),
              new_date = as_date(new_date)) %>% 
       filter(code == "ON")
    # A tibble: 8 x 8
      id     code  start_day hhmmss end_time date       time   new_date  
      <chr>  <chr>     <dbl> <chr>     <dbl> <date>     <drtn> <date>    
    1 7050-1 ON     20200227 000000  2.02e13 2020-02-27 00:00  2020-02-26
    2 7050-1 ON     20200227 003545  2.02e13 2020-02-27 00:35  2020-02-26
    3 7050-1 ON     20200227 073415  2.02e13 2020-02-27 07:34  2020-02-27
    4 7050-1 ON     20200228 025936  2.02e13 2020-02-28 02:59  2020-02-27
    5 265-1  ON     20200227 000000  2.02e13 2020-02-27 00:00  2020-02-26
    6 265-1  ON     20200228 023536  2.02e13 2020-02-28 02:35  2020-02-27
    7 265-1  ON     20200228 03000   2.02e13 2020-02-28 03:00  2020-02-28
    8 265-2  ON     20200229 000000  2.02e13 2020-02-29 00:00  2020-02-28
    

    【讨论】:

    • 你能解释一下glue::glue('{date} {time}') 的实际作用吗?
    • 它是 tidyversepaste 类似,带有日期和时间列
    • 谢谢。我不在我的电脑自动取款机后面。我会尽快测试你的解决方案。我知道逻辑有点混乱。我们将 00:00 到 24:00 视为全天日期 x。该服务器从凌晨 03:00 到凌晨 03:00(第二天)记录日志并将其视为日期 x
    猜你喜欢
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2015-12-29
    • 1970-01-01
    • 2020-06-26
    相关资源
    最近更新 更多