Среднее время от as.POSIXct игнорирует даты, используя циклическую статистику

#r #tidyverse #posixct #psych

Вопрос:

Я ищу, чтобы создать простую пользовательскую функцию, которую я могу интегрировать в рабочий процесс канала dplyr.

Я хочу рассчитать среднее значение времени без учета дат. Так, например, учитывая последовательность POSIXct, я хочу извлечь время и рассчитать среднее значение. Однако одно дополнительное осложнение заключается в том, что время является круговым, а это означает, что 00:00:00 и 23:00:00 очень близки друг к другу во времени, но арифметически не так близки. Поэтому я не могу просто использовать что — то вроде mean(time_vector) вычисления среднего значения.

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

  library(tidyverse) library(lubridate) library(psych)  df = data.frame(datetime = as.POSIXct(c("2019-07-14 23:00:17",  "2019-07-14 23:40:20",  "2019-07-14 00:12:45",  "2019-07-14 00:17:19"), tz = "UTC"))  decimal_hours_vector = df %gt;%   mutate(hours = hour(datetime)) %gt;% # extracting hours  mutate(minutes = minute(datetime)) %gt;% # extracting minutes  mutate(seconds = second(datetime)) %gt;% # extracting seconds  mutate(dec_min = (minutes/60*100)/100) %gt;% # converting minutes to decimal hour  mutate(dec_sec = (seconds/60/60*100)/100) %gt;% # converting seconds to decimal hour  rowwise() %gt;%   mutate(dec_hour = sum(hours,dec_min,dec_sec)) %gt;% # summing all three time columns rowwise  ungroup() %gt;% # ungrouping  pull(dec_hour) # extracting dec_hour as vector to use in circadian.mean   # calculating average time with psych  average_time = circadian.mean(decimal_hours_vector)   

Итак, я думаю, что вышесказанное работает, но очень громоздко. Кроме того, я до сих пор не понял, имеет ли смысл конвертировать конечный результат обратно в hh:mm:ss или он должен оставаться в десятичном формате и все ли работает так, как должно.

В отличие от использования описанного выше трудоемкого процесса, есть ли лучший или более разумный способ сделать это?

Комментарии:

1. Похоже, вам может понадобиться рассчитать остатки десятичного времени по модулю после деления на 12 или 24 часа, но я не могу сказать, какое правило вам на самом деле нужно. Укажите еще несколько примеров. Объекты POSIXct на самом деле уже являются десятичными числами под их атрибутами класса. Я думаю, вам нужно сказать, каков правильный ответ для большего набора примеров.

2. ммм….. Честно говоря, я очень смущен. Я могу привести общий пример, возможно, это помогло бы? Допустим, меня интересует среднее время входа в магазин, люди заходят с 9 утра до 5 вечера в любое время. В конечном счете мне нужно удобное время, которое, я могу сказать, является моим пиковым временем потока. Это игнорирование дней, просто интересуют часы, минуты и секунды.

3. Если вы ограничиваете домен менее чем на 8 часов, я не думаю, что вам нужно завязывать себя в узлы.

4. Да, возможно, это был глупый пример. Фактический набор данных имеет время в течение 8 месяцев в течение 24 часов.

5. Тогда вам нужно сказать, каков на самом деле правильный ответ. Ваши консультанты не могут сказать, что это такое. Если бы 24 раза были равномерно распределены в течение 24 часов, каково было бы «среднее значение»? 12 часов дня? Возможно, вам захочется изучить «циклическую статистику». Есть пакет с именем … подождите его … «круговой».