如何在工作日选择时间范围以及下一列的相关数据

时间:2012-08-10 17:54:10

标签: r range

以下是.csv文件中子集数据的示例。有三列没有标题。第一列表示日期/时间,第二列表示加载[kw],第三列表示1 =工作日,0 =周末/假日。

9/9/2010 3:00   153.94  1
9/9/2010 3:15   148.46  1

我想在R中编程,以便在9月的一个月内在所有工作日(当第三列为1)的10:00到20:00的时间范围内选择第一和第二列,而不是知道什么是最好和最有效的代码方式。

code dt <- read.csv("file", header = F, sep=",") 

#Select a column with weekday designation = 1, weekend or holiday = 0 

y <- data.frame(dt[,3]) 

#Select a column with timestamps and loads 

x <- data.frame(dt[,1:2]) 
t <- data.frame(dt[,1]) 

#convert timestamps into readable format 

s <- strptime("9/1/2010 0:00", format="%m/%d/%Y %H:%M") 
e <- strptime("9/30/2010 23:45", format="%m/%d/%Y %H:%M") 
range <- seq(s,e, by = "min") 
df <- data.frame(range)

1 个答案:

答案 0 :(得分:2)

OP在没有显示“低效代码”的情况下要求“最佳和最有效的代码编码方式”,所以@Justin是对的。

似乎OP对R来说是新的(它正式为the summer of love)所以我试一试,我有一个解决方案(不确定效率......)

index <- c("9/9/2010 19:00", "9/9/2010 21:15", "10/9/2010 11:00", "3/10/2010 10:30")
index <- as.POSIXct(index, format = "%d/%m/%Y %H:%M")

set.seed(1)
Data <- data.frame(Date = index, load = rnorm(4, mean = 120, sd = 10), weeks = c(0, 1, 1, 1))

## Data
##                  Date   load weeks
## 1 2010-09-09 19:00:00 113.74     0
## 2 2010-09-09 21:15:00 121.84     1
## 3 2010-09-10 11:00:00 111.64     1
## 4 2010-10-03 10:30:00 135.95     1


cond <- expression(format(Date, "%H:%M") < "20:00" & 
                   format(Date, "%H:%M") > "10:00" & 
                   weeks == 1 & 
                   format(Date, "%m") == "09")

subset(Data, eval(cond))
##                  Date   load weeks
## 3 2010-09-10 11:00:00 111.64     1