r - среднее время, исключая день - PullRequest
0 голосов
/ 05 января 2020

Я хочу усреднить две метки времени, но исключая день. Например, мне нужно в среднем 9:00 утра понедельника и 10:00 утра вторника, чтобы быть только 9:30 утра.

В качестве примера возьмем следующий код:

x$Hora.inicio[1]
[1] "2019-11-15 23:06:00 UTC"

class(x$Hora.inicio[1])
[1] "POSIXct" "POSIXt" 

mean(c(x$Hora.inicio[1], x$Hora.inicio[2]))
[1] "2019-11-16 10:16:00 UTC"

Этот результат не является удовлетворительным. Как мне усреднить временные метки, чтобы результат учитывал только время, а не день?

PS: Это , это и это вопрос похож на мой, но не отвечает на мой конкретный c вопрос.

Ответы [ 2 ]

2 голосов
/ 05 января 2020

Пакет lubridate может помочь. Возможно, в пакете есть функция, которая уже делает это, но я не смог быстро ее найти. Вот функция, которую вы можете использовать, если вы хотите, чтобы разница в секундах между двумя значениями, независимо от даты:

library(lubridate)

time_date2 <- now()
time_date1 <- time_date2 - 3600 * 20 #20 hours ago
time_length(time_date2 - time_date1)

time_sub_sec <- function(t1, t2) {
  (hour(time_date1) - hour(time_date2)) * 3600 + 
    (minute(time_date1) - minute(time_date2)) * 60 +
    second(time_date1) - second(time_date2)
}

time_sub_sec(time_date2, time_date1) # four hour time difference = 14400 seconds
#14400
1 голос
/ 05 января 2020

Сначала я удалил бы «дату с полами» (0:00 в тот же день), а затем использовал бы разницу во времени дат. Работает также, если исходные даты находятся в другом часовом поясе, чем UT C:

# input
d1 <- as.POSIXct("2019-11-15 23:06:00", tz = "UTC")
d2 <- as.POSIXct("2019-11-14 03:01:00", tz = "UTC")

# remove 0:00 of the same day (but keep time zone!)
remove_day <- function(d) {
  d - as.POSIXct(format(d, "%Y-%m-%d %Z"), tz = format(d1, "%Z"))
}
t1 <- remove_day(d1)
t2 <- remove_day(d2)

# average
mean_time <- mean(c(t1, t2))
# mean_time is now: "Time difference of 13.05833 hours"

# nicely formatted (date is arbitrary, won't be printed):
format(as.POSIXct("2010-01-01", tz = "UTC") + mean_time, "%H:%M:%S")  
# output: [1] "13:03:30"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...