【问题标题】:For loops in R (time to time intervals)R中的循环(时间间隔)
【发布时间】:2015-11-04 06:52:05
【问题描述】:

我想使用 R 语言将我的数据(时间)转换为相应的时间间隔。我的数据框如下所示:

Date,Time,Lots,Status
"10-28-15","00:04:13","13-09","1"
"10-28-15","00:04:16","13-10","1"
"10-28-15","00:04:30","13-11","1"
"10-28-15","00:04:44","13-12","1"
"10-28-15","00:04:48","13-13","1"
"10-28-15","00:04:50","13-14","1"
"10-28-15","00:04:57","13-15","0"
"10-28-15","00:04:57","13-16","0"
"10-28-15","00:05:04","13-17","0"
"10-28-15","00:05:04","13-18","0"

我想输出这样的间隔(每小时/每 15 分钟有 4 个间隔)

Date,Time,Lots,Status,*interval*
"10-28-15","00:04:13","13-09","1",*"00:04:00"*
"10-28-15","00:04:16","13-10","1","00"04"15"
"10-28-15","00:04:30","13-11","1","00:04:30"
"10-28-15","00:04:44","13-12","1","00:04:45"
"10-28-15","00:04:48","13-13","1","00:04:45"
"10-28-15","00:04:50","13-14","1","00:04:45"
"10-28-15","00:04:57","13-15","0","00:04:45"
"10-28-15","00:04:57","13-16","0","00:04:45"
"10-28-15","00:05:04","13-17","0","00:05:00"
"10-28-15","00:05:04","13-18","0","00:05:00"

如果我使用for循环,比如

for(i=0,i<=60,i+15)
} for(if(i>i && i<=i+15)
}

我如何在 R 语言中做到这一点?谢谢大家的帮助,编程新手..

sample$int<- strptime(paste(sample$V1,sample$V2),format="%m-%d-%y %H:%M:%S")
min_V2<-trunc(min(strptime("28-10-2015 00:00:20", "%d-%m-%y %H:%M:%S")),"min")
max_V2<-trunc(max(strptime("28-10-2015 23:59:59", "%d-%m-%y %H:%M:%S")),"min") + 900
out <- cut(sample$int, breaks = seq(min_V2, max_V2, by = "15 min"))

【问题讨论】:

  • cut 也可以与日期/时间对象一起使用。您的数据的str 是什么?
  • 嗨@AnandaMahto。感谢回复。看过cut功能,但不知道怎么用。

标签: r time


【解决方案1】:

我假设您在描述您想要的内容时指的是 ,而不是 分钟

这是一个基本示例,说明我们如何将您的输入数据转换为 15 秒间隔:

首先,将“日期”和“时间”列转换为实际的日期/时间对象:

x <- strptime(paste(mydf$Date, mydf$Time), 
              format = "%m-%d-%y %H:%M:%S")

其次,找出您的值范围内的最小值和最大值。由于这些值似乎来自同一天,但分钟数不定,因此我选择了“min”来截断。对于max 值,我添加了 60 秒以四舍五入到下一分钟。

min_x <- trunc(min(x), "min")
max_x <- trunc(max(x), "min") + 60

第三,我们可以使用seq 每 15 秒创建一个断点序列。我们可以在cut 中使用这些断点:

out <- cut(x, breaks = seq(min_x, max_x, by = "15 sec"))
out
#  [1] 2015-10-28 00:04:00 2015-10-28 00:04:15 2015-10-28 00:04:30
#  [4] 2015-10-28 00:04:30 2015-10-28 00:04:45 2015-10-28 00:04:45
#  [7] 2015-10-28 00:04:45 2015-10-28 00:04:45 2015-10-28 00:05:00
# [10] 2015-10-28 00:05:00
# 8 Levels: 2015-10-28 00:04:00 ... 2015-10-28 00:05:45

第四,如果您只对时间间隔感兴趣,您可以将cut 的输出重新格式化为日期/时间对象,并使用format 仅提取小时/分钟/秒部分。

format(as.POSIXct(out), "%H:%M:%S")
#  [1] "00:04:00" "00:04:15" "00:04:30" "00:04:30" "00:04:45" "00:04:45"
#  [7] "00:04:45" "00:04:45" "00:05:00" "00:05:00"

【讨论】:

  • 感谢@Ananda Mahto。似乎最小和最大生成错误,因为它的输出是 NA
  • @SiewmeiLoh,我在回答中解释了如何使用trunc。您需要根据您的实际数据进行调整。
  • 对不起,我还是不明白。我需要将“min”参数更改为函数调用吗?如果你能给我举个例子,我很感激……比如说,我的最小值是 0。
  • @SiewmeiLoh,“min”参数应该是您希望使用的最短日期,在您想要报告的最短时间间隔内。例如,您的实际最小日期/时间是“2015 年 10 月 28 日,00:04:13”。由于您有兴趣将其分解为从 0 秒开始的 15 秒块,因此我们可以合理地将这种情况下的最小值设置为 strptime("28-10-2015 00:04:00", "%d-%m-%Y %H:%M:%S")。同样,理论上您的最大值可以设置为 strptime("28-10-2015 00:05:15", "%d-%m-%Y %H:%M:%S"),因为您的样本数据集中没有任何值高于此值。
  • 我试图更改部分日期格式,代码最终显示错误,因为最小值变为 NA。感谢您能否告诉我代码有什么问题,因为我找不到任何代码。谢谢。代码被编辑到上面的帖子中。
猜你喜欢
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 2017-07-18
相关资源
最近更新 更多