在R中按小时切割POSIXlt类型

时间:2015-05-24 03:08:09

标签: r

假设我有以下数据

plt <- seq(as.POSIXlt("2010-01-01 01:20:30"), as.POSIXlt("2010-12-31 12:00:30"), 
           length.out = 10)
df <- data.frame(plt)

                   plt
1  2010-01-01 01:20:30
2  2010-02-10 13:11:36
3  2010-03-23 02:02:43
4  2010-05-02 13:53:50
5  2010-06-12 01:44:56
6  2010-07-22 13:36:03
7  2010-09-01 01:27:10
8  2010-10-11 13:18:16
9  2010-11-21 00:09:23
10 2010-12-31 12:00:30

我要做的是按时间缩短以下日期。我的意思是我想在00:00:00 - 06:00:00,B因子到06:00:01 - 12:00:00,C因子到12:00:01的时间分配A因子 - 18:00:00,D因子至18:00:01 - 24:00:00希望在df的单独列中找到这些因素。任何人都知道如何做到这一点?

3 个答案:

答案 0 :(得分:3)

您可以使用POSXlt信息提取小时,然后使用cut()创建分组

df$timeclass <- cut(as.POSIXlt(df$plt)$hour, 
    breaks=c(0,6,12,18,24), 
    labels=c("A","B","C","D"),
    include.lowest=T)
df
#                    plt timeclass
# 1  2010-01-01 01:20:30         A
# 2  2010-02-10 13:11:36         C
# 3  2010-03-23 02:02:43         A
# 4  2010-05-02 13:53:50         C
# 5  2010-06-12 01:44:56         A
# 6  2010-07-22 13:36:03         C
# 7  2010-09-01 01:27:10         A
# 8  2010-10-11 13:18:16         C
# 9  2010-11-21 00:09:23         A
# 10 2010-12-31 12:00:30         B

答案 1 :(得分:1)

尝试以下

library(data.table)
setDT(df) # converts df to a data.table

## Broken down into steps
df[, plt_numb := as.numeric(plt)]
df[, groups   := ((plt_numb - 1) %% 86400) %/% 21600]
df[, group_factors := factor(groups, levels=0:3, labels=c("A", "B", "C", "D"))]

只需一步:

 df[, newCols := 
        factor({((as.numeric(plt) - 1) %% 86400) %/% 21600}
            , levels = 0:3
            , labels = c("A", "B", "C", "D")
     )]

请注意 * 86400 == 24小时* 60分钟* 60秒
* 21600 == 6小时* 60分钟* 60秒
因此,取模86400只产生时间值;取余数除以21600将值组成3组。

答案 2 :(得分:1)

您可以使用lubridate让您的生活更轻松。可能有一种更好的方法可以做到这一点,但我认为这种方式最容易阅读。

library(lubridate)
df$time_factor <- as.factor(sapply(df$plt, function(x) {
  date_x <- floor_date(x, "day")
  if(x < date_x + hours(6)){ # time is 6am
    return("A")
  }
  if(x < date_x + hours(12)){ # time is midday
    return("B")
  }
  if(x < date_x + hours(18)){ # time is 6pm
    return("C")
  }
  if(x < date_x + hours(24)){
    return("D")
  }
}))