首页 > 解决方案 > 使用 R 创建包含基于日期时间的连续计数的向量

问题描述

我在 R 中有一个数据框,如下所示...

Year  Month  Day  Hour DateTime 
1950  1      4    12   1/4/1950 12:00
1950  1      4    13   1/4/1950 13:00
1950  1      4    14   1/4/1950 14:00
1950  1      4    15   1/4/1950 15:00
1950  1      4    18   1/4/1950 18:00
1950  1      4    21   1/4/1950 21:00
1950  1      4    22   1/4/1950 22:00
1950  1      5    23   1/5/1950 23:00

数据从年(1950-2017)开始,月(1-12)天(1-31)小时(0-23),我想创建一个向量来总结连续的观察,即观察紧随其后。例如,创建的列向量中的前几个数字应该是(4,1,3),因为前四个观测值是连续的,接下来不是,那么接下来的三个是连续的。

标签: r

解决方案


我们用 来检查相邻日期之间的差异difftime,检查差异是否不等于 1,用于rle获取计数

dt <- as.POSIXct(df1$DateTime, format = "%m/%d/%Y %H:%M")
rle(cumsum(c(TRUE, difftime(dt[-1], dt[-length(dt)], unit = "hour") != 1)))$lengths
#[1] 4 1 2 1

或者正如@Ryan 提到的,diff也可以使用

rle(cumsum(c(TRUE, diff(dt, unit = "hour") != 1)))$lengths

数据

df1 <- structure(list(Year = c(1950L, 1950L, 1950L, 1950L, 1950L, 1950L, 
1950L, 1950L), Month = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Day = c(4L, 
4L, 4L, 4L, 4L, 4L, 4L, 5L), Hour = c(12L, 13L, 14L, 15L, 18L, 
21L, 22L, 23L), DateTime = c("1/4/1950 12:00", "1/4/1950 13:00", 
"1/4/1950 14:00", "1/4/1950 15:00", "1/4/1950 18:00", "1/4/1950 21:00", 
"1/4/1950 22:00", "1/5/1950 23:00")), class = "data.frame", row.names = c(NA, 
 -8L))

推荐阅读