How can I sum or average hours in R

Why the sum and average do not work in hours retrieved using lubridate, when a simple addition using + and division works individually.

Dataset

Category Time1 Time2 hr1 hr2 1 A 0:30:00 24:00:00 30M 0S 24H 0M 0S 2 B 1:00:00 23:23:00 1H 0M 0S 23H 23M 0S 3 C 2:30:00 23:00:59 2H 30M 0S 23H 0M 59S 4 D 3:00:00 45:00:00 3H 0M 0S 45H 0M 0S > dput(t1) structure(list(Category = c("A", "B", "C", "D"), Time1 = c("0:30:00", "1:00:00", "2:30:00", "3:00:00"), Time2 = c("24:00:00", "23:23:00", "23:00:59", "45:00:00"), hr1 = structure(c(0, 0, 0, 0), year = c(0, 0, 0, 0), month = c(0, 0, 0, 0), day = c(0, 0, 0, 0), hour = c(0, 1, 2, 3), minute = c(30, 0, 30, 0), class = structure("Period", package = "lubridate")), hr2 = structure(c(0, 0, 59, 0), year = c(0, 0, 0, 0), month = c(0, 0, 0, 0), day = c(0, 0, 0, 0), hour = c(24, 23, 23, 45), minute = c(0, 23, 0, 0), class = structure("Period", package = "lubridate"))), .Names = c("Category", "Time1", "Time2", "hr1", "hr2"), row.names = c(NA, -4L), class = "data.frame") 

RCODE

 t1<-read.csv("time1.csv", header=TRUE, sep=",",stringsAsFactors=FALSE) library(lubridate) t1$hr1<-hms(t1$Time1) t1$hr2<-hms(t1$Time2) 

# THIS WORK

 > t1$hr1[4]+t1$hr2[3] [1] "26H 0M 59S" > (t1$hr1[4]+t1$hr2[3])/2 [1] "13H 0M 29.5S" 

But it is not

 > sum(t1$hr1[4]+t1$hr2[3]) [1] 59 > mean(t1$hr1[4]+t1$hr2[3]) [1] 59 
+5
source share
1 answer

You can use period_to_seconds to convert to seconds, make sum or mean , and then seconds_to_period to convert back to period .

 library(lubridate) t1$hr1 = hms(t1$Time1) t1$hr2 = hms(t1$Time2) fsum = function(...){ seconds_to_period(sum(period_to_seconds(...))) } fmean = function(...){ seconds_to_period(mean(period_to_seconds(...))) } tohms = function(...){ ans = c(...) ans@hour = ans@day *24 + ans@hour ans@day = 0 ans } t2 = fsum(t1$hr1[4]+t1$hr2[3]) t2 #> [1] "1d 2H 0M 59S" tohms(t2) #> [1] "26H 0M 59S" 

If you expect sum or mean exceed the year (approximately 365.25 days), you may need to make further adjustments.


DATA
 t1 = structure(list(Category = c("A", "B", "C", "D"), Time1 = c("0:30:00", "1:00:00", "2:30:00", "3:00:00"), Time2 = c("24:00:00", "23:23:00", "23:00:59", "45:00:00")), class = "data.frame", row.names = c("1", "2", "3", "4")) 
0
source

Source: https://habr.com/ru/post/1216425/


All Articles