【问题标题】:Calculations with minutes and seconds in RR中的分钟和秒计算
【发布时间】:2016-09-27 04:16:11
【问题描述】:

我是 R 统计软件的新手,我烘焙咖啡并在此过程中记录不同的事件。在烘焙过程之后,我想使用 R 进行一些计算和分析,并通过查找事件之间的时间跨度来得出该期间的重要持续时间 - 例如:

  • 00:00 开始
  • 05:10 黄色
  • 07:15 肉桂
  • 09:00 第一次破解
  • 11:30 烘烤过程结束

(如果您是咖啡爱好者,想了解更多关于咖啡烘焙参数的信息:https://coffee-mind.com/profile/

我可以如何/以什么格式存储这些事件并计算事件之间的时间跨度?我想在 MM:SS 中显示时间跨度,但还要查看 MM:SS 期间的总秒数。我一直在查看不同的软件包(如 chron 和 lubridate),但它们似乎都与时区、绝对日期等有关,而我只对分钟和秒感兴趣(无论日期和时区如何——不感兴趣在这里)以及如何对这些记录的事件进行简单的减法计算。 我对“如何编写代码”不感兴趣,但对已经为此设计的函数(如 chron 和 lubridate)以及如何直接使用它们(我还认为这是这个社区最普遍有趣的方法?)

【问题讨论】:

    标签: r time duration seconds


    【解决方案1】:

    lubridate 提供您需要的功能。除了包含日期和时间的 POSIXct 类之外,它还提供持续时间的类 period。您可以将%M:%S 格式的时间转换为period,如下所示:

    library(lubridate)
    times <- c("00:00", "05:10", "07:15", "09:00", "11:30")
    ms(times)
    ## [1] "0S"      "5M 10S"  "7M 15S"  "9M 0S"   "11M 30S"
    

    然后您可以使用as.period() 转换为您想要的时间单位:

    as.period(ms(times), unit = "sec")
    ## [1] "0S"   "310S" "435S" "540S" "690S"
    

    如果你现在转换成数字,你会得到秒数:

    seconds <- as.numeric(as.period(ms(times), unit = "sec"))
    seconds
    ## [1]   0 310 435 540 690
    

    您现在可以使用 diff() 获得事件之间的秒数差异:

    diff(seconds)
    ##[1] 310 125 105 150
    

    请注意,函数 ms() 的其他变体可以用于其他格式的时间:hm() (%H:%M:%S) 和 hms() (%H:%M)。

    【讨论】:

    • 太棒了!我会试试看:-)
    • 我有一个小问题,我的咖啡烘焙时间是几分钟而不是几小时,所以在尝试上面的代码时我得到了一些非常大的价值。我发现 hms 函数对于咖啡烘焙来说是正确的,因为它将 05:10 解释为“5 分 10 秒”,而 hm 函数将其解释为“5 小时 10 分钟”。非常感谢您的文字完全解决了我的问题 hm -> hms 作为我必须做出的唯一改变才能使其达到我的目的!如果你曾经在哥本哈根,你可以免费参加烘焙课程:-) coffee-mind.com/shop
    • 我很抱歉这个错误。我在阅读您的问题时不够小心,只是假设您的意思是 %H:%M。我很高兴您自己弄清楚了如何调整解决方案,但是我仍然对答案进行了一些更改。祝你的咖啡好运!
    • 谢谢斯蒂布!非常感谢:-)
    【解决方案2】:

    不确定这是否有帮助,但当我需要将 youtube 视频的时间跨度转换为秒时,我使用了此功能。它们的格式为 hh:mm:ss,因此当您输入带有示例中时间的向量时,它可以为您工作

    toseconds<-function(x){
      sec<-rep(NA,length(x))
      minu<-rep(NA,length(x))
      hodina<-rep(NA,length(x))
      total<-rep(NA,length(x))
      for (i in 1:length(x)) {
        if (str_count(x[i],":")==2) {
          sec[i]<-as.numeric(str_sub(str_replace(x[i],":",""),str_locate(str_replace(x[i],":",""),":")[ ,1]+1))
          minu[i]<-as.numeric(str_sub(x[i],str_locate(x[i],":")[ ,1]+1,str_locate(x[i],":")[ ,1]+2))
          hodina[i]<-as.numeric(str_sub(x[i],1,str_locate(x[i],":")[ ,1]-1))
        } else {
          sec[i]<-  as.numeric(str_sub(x[i],str_locate(x[i],":")[ ,1]+1))
          minu[i]<-as.numeric(str_sub(x[i],1,str_locate(x[i],":")[ ,1]-1))
          hodina[i]<-0
        }
    
        total[i]<-hodina[i]*3600+minu[i]*60+sec[i]
      } 
    
      total
    }
    

    【讨论】:

      【解决方案3】:

      为了避免加载另一个库...

      MinSeg=function(fim, ini){
        dif=as.numeric(difftime(fim, ini, units='min'))
        return(paste0(sprintf('%02d', as.integer(dif)), ":"
                     ,sprintf('%02.0f', (dif-as.integer(dif))*60)))
      }
      ini=Sys.time()
      fim=Sys.time()
      MinSeg(fim,ini)
      [1] "00:03"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多