Объединить / суммировать дату и время по x-минутным блокам - PullRequest
1 голос
/ 15 июня 2019

У меня есть следующий фрейм данных (mydf) с метками времени UNIX:

1543748345000
1543760946000
1543752164000
1543720144000
1543752713000
1543781064000
1543753688000
1543765145000
… 

(n = 200 000)

Я конвертирую их в формате даты, используя:

mydf <- as.POSIXct(as.integer(as.numeric(as.character(mydf)) / 1000.0),origin='1970-01-01', tz="GMT")

Это работает хорошо, и я получаю хорошо упорядоченные данные с датами и точным временем:

2018-12-01 00:07:05
2018-12-01 00:09:04
2018-12-01 00:25:42
…
  1. Вопрос) Это основано на моем системном времени и, следовательно, моем часовом поясе (CET +1) или мне нужно преобразовать его снова?

Теперь, допустим, я хочу создать фрагменты по x минут (например, 30 минут), которые подсчитывают, сколько наблюдений у меня есть в x-минуты, например:

From | To | Count
2018-12-01 00:00:00 | 2018-12-01 00:30:00 | 3
2018-12-01 00:30:00 | 2018-12-01 01:00:00 | 6
2018-12-01 01:00:00 | 2018-12-01 01:30:00 | 5
…

В то же время у меня есть несколько других числовых переменных в моем фрейме данных, и я хочу получить среднее значение в моем новом фрейме x-minutes-chunks-data-frame.(например, первые три наблюдения находятся в первом фрагменте (= одно наблюдение), и здесь я хочу получить среднее значение для каждой переменной этих трех наблюдений).

Вопрос) Есть ли у вас какие-либо идеи, как я могу это сделать эффективно?

Приветствия:)

РЕДАКТИРОВАТЬ:

mydf <- data.frame("content" = c(replicate(10,"Here is Text")), 
           "replies" = c(1,2,3,2,5,2,6,2,6,3), 
           "credits" = c(4,7,3,6,2,11,7,10,9,0),
           "unix_timestamp" = c("2018-12-01 00:07:05 GMT", "2018-12-01 00:09:04 GMT", "2018-12-01 00:25:42 GMT", "2018-12-01 00:28:40 GMT", 
                                "2018-12-01 01:09:11 GMT", "2018-12-01 02:19:05 GMT", "2018-12-01 03:29:06 GMT", "2018-12-01 04:06:30 GMT", 
                                "2018-12-01 04:29:06 GMT", "2018-12-01 05:29:16 GMT"))

Моя цель:

data.frame("count" = c(4,0),
           "mean_replies" = c(2,0), 
           "mean_credits" = c(5,0),
           "from" = c("2018-12-01 00:00:00 GMT","2018-12-01 00:30:00 GMT"),
           "to" = c("2018-12-01 00:30:00 GMT", "2018-12-01 01:00:00 GMT"))

1 Ответ

1 голос
/ 15 июня 2019

Что касается вашего первого вопроса, я понятия не имею (даты громоздки, часовые пояса хуже), мне кажется, что если вы установили tz = "GMT", то должно быть часовым поясом.

Что касается вашего второго вопроса, вы можете легко сделать это с помощью data.table и cut():

# load libraries
library(data.table)

# load data
dt <- fread("1543748345000
1543760946000
1543752164000
1543720144000
1543752713000
1543781064000
1543753688000
1543765145000")

# Convert dates to appropriate format
dt[, V1 := as.POSIXct(as.integer(as.numeric(as.character(V1)) / 1000.0),origin='1970-01-01', tz="GMT")]

# count occurrences by 30 minutes chuks:
dt[, .N, 
     by = cut(V1, 
              seq(as.POSIXct("2018-12-02", tz = "GMT"),
                  as.POSIXct("2018-12-03", tz = "GMT"), 
                  by = "30 min"))]

Что приводит к:

                   cut N
1: 2018-12-02 10:30:00 1
2: 2018-12-02 14:00:00 1
3: 2018-12-02 12:00:00 3
4: 2018-12-02 03:00:00 1
5: 2018-12-02 20:00:00 1
6: 2018-12-02 15:30:00 1

######## ДОБАВЛЕНО ДЛЯ АДРЕСА ИЗМЕНЕННЫХ ДАННЫХ В ВОПРОСЕ #######

cutVector <- seq(as.POSIXct("2018-12-01", tz = "GMT"),
                 as.POSIXct("2018-12-02", tz = "GMT"), 
                 by = "30 min")

mydf[, .(mean_replies = mean(replies), 
         mean_credits = mean(credits), 
         count = .N), 
       by = cut(V1, cuVector)]

Вам все еще может потребоваться изменить / настроить имена переменных, диапазонов и т. Д.

Это хорошая идея, читать внимательно ?data.table и ?cut

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...