R:根据时间变量

时间:2016-06-14 16:58:09

标签: r

我有一个csv文件,June_8th有2列,一个时间戳,V1(小时:分钟:秒)(01:55:41)和一个ID号V2(在这个阶段不是很重要)。我想根据时间戳的小时将24个不同部分的数据分开。然后找出每小时有多少时间戳的计数。

我尝试的代码是:

Time_2am = subset(June_8th, V1 >= 02:00:00 & V1 < 03:00:00)

我不断收到警告信息:

  

1:在2:0:0:数值表达式有3个元素:只有第一个元素   使用

     

2:在Ops.factor(V1,2:0:0)中:'&gt; ='对因子无意义

     

3:在3:0:0:数值表达式有4个元素:只有第一个元素   使用

     

4:在Ops.factor(V1,3:0:0)中:'&lt;'对因素没有意义

2 个答案:

答案 0 :(得分:1)

一些事情:

  1. 02:00:00不代表时间戳 - 事实上,它等同于(2:0):0,其中2:0与向量{{1}相同通过执行另一个操作c(2, 1, 0),您尝试创建一个以:开头并以c(2, 1, 0)结尾的向量,这没有意义,所以R只使用第一个值来自向量,即0和第二个参数2,它给出了向量0

  2. 您的时间戳似乎具有类型因子(https://stat.ethz.ch/R-manual/R-devel/library/base/html/factor.html)。它们无法与通常的比较运算符进行比较,它们的级别可能与实际时间戳的顺序不对应。

  3. 您可以做的是将时间戳转换为字符串,然后与另一个字符串进行比较,例如,使用c(2, 1, 0)

答案 1 :(得分:0)

如果您想根据时间戳的小时将数据分成24个部分,则可以使用以下内容提取小时数:

library(lubridate)
hour(hms(June_8th$V1))

给出:

> hour(hms(June_8th$V1))
[1] 1 2 3

如果您想要对数据进行分组,那么您可以这样做:

June_8th[hour(hms(June_8th$V1)) == 2,]

给出:

        V1 V2
2 02:35:51  2

在基础R中,您可以通过以下方式获得相同的结果:

# create an hour variable

> format(strptime(paste('2016-06-08', June_8th$V1), format = '%Y-%m-%d %H:%M:%S'), '%H')
[1] "01" "02" "03"

# subset the data to select only the time between 02:00:00 and 03:00:00

> June_8th[format(strptime(paste('2016-06-08', June_8th$V1), format = '%Y-%m-%d %H:%M:%S'), '%H') == '02',]
        V1 V2
2 02:35:51  2

使用过的数据:

June_8th <- data.frame(V1 = c('01:55:41','02:35:51','03:09:34'), V2 = 1:3)