将日期和时间合并/汇总为x分钟的块

时间:2019-06-15 11:18:22

标签: r date dataframe datetime merge

我具有UNIX时间戳的以下数据框(mydf):

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中获取均值。 (例如,前三个观察值在第一个块中(=一个观察值),在这里我想获得这三个观察值的每个变量的平均值)。

  1. 问题) 您知道我如何有效地做到这一点吗?

干杯:)

编辑:

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 个答案:

答案 0 :(得分:1)

关于您的第一个问题,我不知道(日期繁琐,时区更糟),在我看来,如果您建立了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

是个好主意