【问题标题】:How to find different time intervals in r如何在r中找到不同的时间间隔
【发布时间】:2017-04-12 00:46:50
【问题描述】:

我有一个如下所示的日期向量:

"2017-01-05 08:40:00 COT" "2017-01-05 08:50:00 COT" "2017-01-05 09:00:00 COT" "2017-01-05 09:10:00 COT" "2017-01-05 10:30:00 COT" "2017-01-05 10:40:00 COT" "2017-01-05 10:50:00 COT" "2017-01-05 11:00:00 COT" "2017-01-05 11:10:00 COT" "2017-01-05 11:20:00 COT" "2017-01-05 11:30:00 COT" "2017-01-05 11:40:00 COT""2017-01-05 11:50:00 COT" "2017-01-05 12:00:00 COT" "2017-01-05 12:10:00 COT" "2017-01-05 12:20:00 COT" "2017-01-05 12:30:00 COT" "2017-01-05 12:40:00 COT" "2017-01-05 12:50:00 COT" "2017-01-05 13:00:00 COT" "2017-01-05 13:10:00 COT" "2017-01-05 13:20:00 COT" "2017-01-05 13:30:00 COT" "2017-01-05 13:40:00 COT""2017-01-05 13:50:00 COT" "2017-01-05 14:00:00 COT" "2017-01-05 14:10:00 COT" "2017-01-05 14:20:00 COT" "2017-01-05 14:30:00 COT" "2017-01-05 14:40:00 COT" "2017-01-05 14:50:00 COT" "2017-01-05 15:00:00 COT"

并被声明为 POSIXct。我需要在这个向量中找到不同时间间隔的开始和结束时间。对于此日期,有 2 个时间间隔:从 "2017-01-05 08:40:00 COT""2017-01-05 09:10:00 COT" 和从 "2017-01-05 10:30:00 COT""2017-01-05 15:00:00 COT"

我已经尝试了命令范围(数据),但我得到了整个向量的开始日期和结束日期,而不是不同的间隔。希望有人可以帮忙

【问题讨论】:

  • 你如何定义不同的间隔?有什么不一样的 10 分钟?查看diff(vecdates) 以检查连续值之间的差异。
  • @thelatemail 是的,不是 10 分钟

标签: r datetime xts


【解决方案1】:

使用时间之间的一些差异来找到向量中的断点,我称之为tx(在下面创建代码):如您所见,结果分为8:409:10 和然后10:30 到最后。

diff(tx)
#Time differences in mins
#[1] 10 10 10 80 10 10 10

cumsum(c(FALSE, diff(tx)!=10))
#[1] 0 0 0 0 1 1 1 1

split(tx, cumsum(c(FALSE, diff(tx)!=10)))
#$`0`
#[1] "2017-01-05 08:40:00 COT" "2017-01-05 08:50:00 COT" "2017-01-05 09:00:00 COT" "2017-01-05 09:10:00 COT"
#
#$`1`
#[1] "2017-01-05 10:30:00 COT" "2017-01-05 10:40:00 COT" "2017-01-05 10:50:00 COT" "2017-01-05 11:00:00 COT"

tx 在哪里:

tx <- structure(c(1483623600, 1483624200, 1483624800, 1483625400, 1483630200, 
1483630800, 1483631400, 1483632000), class = c("POSIXct", "POSIXt"
), tzone = "America/Bogota")

【讨论】:

  • 几乎可以完美运行,但是每个“正确”间隔的最后一个日期都将转到下一个。 cumsum(c(FALSE, diff(tx)!=10)) 可以完美运行,但 split(tx, cumsum(c(FALSE, diff(tx)!=10))) 不行
  • @alejandroandrade - 我不知道这怎么可能 - split 只是根据 cumsum 值分组。如果一个有效,另一个也应该。
  • 很糟糕,我错过了FALSE。感谢您的回答
  • 当使用功能差异时,假设我想要小时、秒等的差异,如何实现?
【解决方案2】:

假设您将所有日期放在一个名为“日期”的向量中,您可以执行以下操作

Ranges <- cut(dates, breaks = "2 hours")

【讨论】:

  • 它可以工作 2 小时,但我需要 10 分钟,老实说,@thelatemail 的答案完美地解决了它。无论如何谢谢
【解决方案3】:

如果你在这个输入策略中替换你的文本,你会得到一个日期时间向量:

 dat <- as.POSIXct( scan(text=' ... ',quote="\"",what="") )
 # Don't use spaces flanking the ellipsis

然后您可以使用 findInterval 对日期进行分类并选择一个具有您想要的间隔指定的日期,在您的情况下为 1 和 3。

 Breaks <- scan(text='"2017-01-05 08:40:00 COT","2017-01-05 09:10:00 COT","2017-01-05 10:30:00 COT" , "2017-01-05 15:00:00 COT"', sep=",", what="")
# Read 4 items
findInterval(dat,  as.POSIXct(Breaks ) )
# [1] 1 1 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4

【讨论】:

  • 您似乎在这里得到 4 个间隔而不是 2 个
  • 而且我现在必须先确定间隔,然后我实际上有 10.000 个日期,所以它不是自动的。还是谢谢
猜你喜欢
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多