【问题标题】:Time interval between several dates (days and hours)几个日期之间的时间间隔(天和小时)
【发布时间】:2021-03-10 03:10:08
【问题描述】:

我知道有人就同一主题提出了很多问题,但我没有找到这个特定问题的答案,尽管我尝试调整其他代码来解决我的问题。

我的数据框“v1”有超过 30 万行,变量“Date”的格式如下:

Date
2015-07-27 17:35:00
2015-07-27 17:40:00
2015-07-27 17:45:00

第一个我想知道是否所有的“日期”间隔都在 5 到 5 分钟的间隔内。如果不是,我想跟踪不同间隔的位置。

第二我假装创建一个新列,可以看到不同间隔的时间戳。例如,“time_int”会出现“00:05:00”、“00:05:00”...

任何帮助将不胜感激。提前谢谢你。

【问题讨论】:

    标签: r datetime


    【解决方案1】:

    您可以使用rollapplyr 来查找两个连续行之间的时间差。然后你可以使用which来查找时差不是5分钟的行。

    dt=read.table(text=text, header=TRUE)
    library(lubridate)
    library(dplyr)
    library(zoo)
    dt=mutate(dt, Date=ymd_hms(Date)) %>%
      mutate(dt, Dif=rollapplyr(Date, 2, function(x) {
      return(difftime(x[2], x[1]))
    }, fill=NA))
    dt
                     Date Dif
    1 2015-07-27 17:35:00  NA
    2 2015-07-27 17:40:00   5
    3 2015-07-27 17:45:00   5
    4 2015-07-27 17:49:00   4
    
    dt[which(dt$Dif != as.difftime(5, units="mins")),]
                     Date Dif
    4 2015-07-27 17:49:00   4
    

    最后,将时间格式化为您想要的格式:

    dt %>% mutate(DifString=format(.POSIXct(Dif*60, tz="GMT"), "%H:%M:%S"))
                     Date Dif DifString
    1 2015-07-27 17:35:00  NA      <NA>
    2 2015-07-27 17:40:00   5  00:05:00
    3 2015-07-27 17:45:00   5  00:05:00
    4 2015-07-27 17:49:00   4  00:04:00
    

    数据

    text="Date
    '2015-07-27 17:35:00'
    '2015-07-27 17:40:00'
    '2015-07-27 17:45:00'
    '2015-07-27 17:49:00'"
    dt=read.table(text=text, header=TRUE)
    

    【讨论】:

    • 谢谢,代码给了我我想要的。我只是不确定 "dt[which(dt$Dif != as.difftime(5, units="mins")),]" 因为它给了我数据帧的标题,就像这样 "# A tibble : 0 x 3 # ... 有 3 个变量:N 、Date 、Dif " 而不是只有我预期的“Dif”列。
    • 这可能意味着时间之间的差异总是5分钟。你可以试试dt$Dif != as.difftime(5, units="mins") 看看是否一切都是假的,这意味着差异总是 5 分钟。你也可以试试which(dt$Dif != as.difftime(5, units="mins"))dt$Dif[which(dt$Dif != as.difftime(5, units="mins"))],它们应该是空向量。
    • 再次感谢您。最后两个代码更方便,因为第一个代码给出了所有行,当你有 1000 个条目时,它有点棘手。还有一件事,最后两个代码忽略了 NA,对吧?这只是为了确保,因为我在第一个条目(日期和时间 0)中有一个 NA,它给了我空向量。
    • 是的,第一个条目中的 NA 应该没问题,因为逻辑 != 运算符按组件工作,并且 which(c(NA, TRUE, TRUE, FALSE))=c(2 ,3) (它忽略了 NA)。
    • 太棒了!感谢您的帮助。
    【解决方案2】:

    这是一个使用lag 计算差异的选项。如果您愿意,可以使用units = "hours" 创建另一个显示小时数的列。

    library(tidyverse)
    library(lubridate)
    
    
    df <- data.frame(date = ymd_hms(c("2015-07-27 17:35:00", 
    "2015-07-27 17:40:00", "2015-07-27 17:49:00", "2015-07-27 19:49:00")))
    
    df %>% 
      mutate(diff = date - lag(date),
             diff_minutes = as.numeric(diff, units = "mins"),
             time_int = format(.POSIXct(diff_minutes*60, "UTC"), "%H:%M:%S")) %>% 
      select(date, diff_minutes, time_int) %>% 
      # Filter the data for a range of minutes
      filter(diff_minutes >= 5 & diff_minutes < 10)
    
    # OUTPUT:
    
    #>                  date diff_minutes time_int
    #> 1 2015-07-27 17:40:00            5 00:05:00
    #> 2 2015-07-27 17:49:00            9 00:09:00
    

    reprex package (v0.3.0) 于 2021-03-09 创建

    原始数据

    date
    <S3: POSIXct>
    2015-07-27 17:35:00             
    2015-07-27 17:40:00             
    2015-07-27 17:49:00             
    2015-07-27 19:49:00 
    

    【讨论】:

      猜你喜欢
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2022-01-22
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 2012-04-10
      相关资源
      最近更新 更多