【问题标题】:Merge/Summarize date and time to x-minutes chunks将日期和时间合并/汇总到 x 分钟块
【发布时间】:2019-10-29 18:44:59
【问题描述】:

我有以下带有 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-Minutes 块(例如 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"))

【问题讨论】:

    标签: r date dataframe datetime merge


    【解决方案1】:

    关于你的第一个问题,我不知道(日期很麻烦,时区更糟),在我看来,如果你建立了tz = "GMT",那么应该是时区。 p>

    关于第二个问题,您可以使用 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是个好主意

    【讨论】:

    • 谢谢!我以前不知道 cut 功能,我认为这正是我正在寻找的。我可以运行你的代码,但我有问题要适应我的情况,因为我从未使用过 data.table-library 并且不完全理解语法(而且我也不是 R-Pro ^^ )。我现在尝试了几个小时,但我只是想出了错误消息:/也许你可以看看我的数据框(我编辑了帖子)。我知道,我的错,我应该在一开始就发布原始的,但我认为对我来说只是一个提示就足够了。
    • 不用担心。一旦我靠近我的机器,我会看看。我现在离电脑很远。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多