2016-05-29 3 views
2

Я новичок в программном обеспечении R, и я обжариваю кофе и записываю различные события во время процесса. После процесса обжарки я хотел бы использовать R, чтобы сделать некоторые расчеты и анализ и получить важные длительности в течение периода, находя промежуток времени между событиями - например:Расчеты минут и секунд в R

  • 00:00 Start
  • 05:10 Желтый
  • 07:15 Cinnamon
  • 09:00 Первый Crack
  • 11:30 Конец обжарки процессу

(если вы кофе выродка и хотите узнать больше о параметрах обжаривания кофе: https://coffee-mind.com/profile/)

Как/в каком формате я могу хранить эти события и рассчитать промежуток времени между событиями? Я хотел бы показать временной интервал в MM: SS, но также увидеть общие секунды в периоде MM: SS. Я смотрел на разные пакеты (например, chron и lubridate), но все они, похоже, интересуются часовым поясом, абсолютными датами и т. Д., И меня интересуют только минуты и секунды (независимо от дня и часового пояса - не интересно вообще здесь) и как делать вычисления, такие как простые вычитания по этим записанным событиям. Меня не интересуют «как написать код», но в функциях (например, chron и lubridate), которые уже разработаны для этого и как их использовать напрямую (что я также предполагаю, что это наиболее интересный подход для этого сообщества?)

ответ

4

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).

+0

Great!Я попробую :-) –

+0

У меня была небольшая проблема, что мои времена в обжаривании кофе - это минуты, а не часы, поэтому у меня есть некоторые действительно большие значения при попытке кода выше. Я выяснил, что функция hms была правильной для обжаривания кофе, поскольку она интерпретирует 05:10 как «пять минут и 10 секунд», где функция hm интерпретировала ее как «5 часов и 10 минут». Большое спасибо за ваш текст, который полностью разрешил мой вопрос с помощью hm -> hms, как единственное изменение, которое мне пришлось внести, чтобы заставить его работать для моей цели! Если вы когда-либо в Копенгагене, вы можете бесплатно взять класс обжарки :-) https://coffee-mind.com/shop –

+0

Прошу прощения за эту ошибку. Я не был достаточно осторожен при чтении вашего вопроса и просто предположил, что вы имели в виду% H:% M. Я рад, что вы сами поняли, как адаптировать решение, но я все же внесли некоторые изменения в ответ. Удачи вам в кофе! – Stibu

1

Не уверен, что это поможет, но я сделал эту функцию, когда мне нужно было преобразовать временной интервал видео в YouTube. Они форматируются чч: мм: сс поэтому он может работать для вас, когда вы вводите вектор с временами, как в вашем примере

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 
} 
+0

Спасибо за код :-) –

0

, чтобы избежать загрузки другой библиотеки ...

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" 
Смежные вопросы