【问题标题】:Binning time series in R?R中的分箱时间序列?
【发布时间】:2013-12-25 23:55:27
【问题描述】:

我是 R 新手。我的数据有 600k 个对象,由三个属性定义:IdDateTimeOfCall

TimeofCall 具有00:00:00 格式,范围从00:00:0023:59:59

我想将TimeOfCall 属性分箱到 24 个箱中,每个箱代表每小时时段(第一个箱 00:00:0000:59:59 等等)。

有人可以告诉我如何做到这一点吗?我尝试使用cut(),但显然我的格式不是数字。提前致谢!

【问题讨论】:

  • 您想在 data.frame 中添加 bin 列吗?或者你有不同的数据结构?
  • 你好 Milktrader,它是 data.frame,是的,它可以工作。
  • 使用 cut2 代替 cut 来自 Hmisc

标签: r timestamp binning


【解决方案1】:

虽然您可以转换为正式的时间表示,但在这种情况下,使用substr 可能会更容易:

test <- c("00:00:01","02:07:01","22:30:15")
as.numeric(substr(test,1,2))
#[1]  0  2 22

使用POSIXct 时间来处理它也可以,如果您计划进一步计算(时间差异等)可能会很方便:

testtime <- as.POSIXct(test,format="%H:%M:%S")
#[1]"2013-12-09 00:00:01 EST" "2013-12-09 02:07:01 EST" "2013-12-09 22:30:15 EST"
as.numeric(format(testtime,"%H"))
#[1]  0  2 22

【讨论】:

  • 这就像一个魅力,谢谢!第二种方法很好!我相信我会更频繁地使用它!快速一个,如果我要从日期中提取一周中的几天,我也可以使用 POSIXct 吗?
  • @Palcente - 如果您已经有一个 Date 变量(或 POSIXct / POSIXlt 日期时间),您可以使用 format,如 format(datevar,"%w"),其中结果为 0-6,周日为 0。
  • 如果我的日期如下:01-Jan-09...你能告诉我我的 POSIXct 格式是什么吗...它会是 format="%d-%b-%y" 吗?
  • @Palcente - 这是正确的格式,它们都列在?strptime 中。这些适用于所有DatePOSIXct/lt 格式。如果您正在处理没有时间的日期,则可能没有真正需要使用POSIXctas.Date 可以正常工作。
  • 感谢您的回答,如果我希望垃圾箱是 3 小时而不是 1 小时,该怎么办?
【解决方案2】:

您可以使用cut.POsixlt 函数。但是您应该将数据强制转换为有效的时间对象。在这里,我使用来自lubridate 的方便的hms。和strftime 获取时间格式。

library(lubridate)
x <- c("09:10:01", "08:10:02",  "08:20:02","06:10:03 ", "Collided at 9:20:04 pm")
x.h <- strftime(cut(as.POSIXct(hms(x),origin=Sys.Date()),'hours'),
         format='%H:%M:%S')

data.frame(x,x.h)

                       x      x.h
1               09:10:01 10:00:00
2               08:10:02 09:00:00
3               08:20:02 09:00:00
4              06:10:03  07:00:00
5 Collided at 9:20:04 pm 22:00:00

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2021-07-16
    • 2016-08-12
    相关资源
    最近更新 更多