1

我有一些格式为 CSV 的数据:

date, total, avg, hour00, hour01, ... hour23

我想将此扩展为格式为时间序列:

date-time(date + hourXX), (value of hourXX)

示例输入:

      date, total, avg, hour00, hour01, hour02, hour03, ..., hour23
2013-01-27,   240,  10,      5,     15,     20,      0, ...,     14
2013-01-28,   305,  15,      9,     18,     17,     12, ...,     16

示例输出(data.frame 对象):

       date-time, hourXX
2013-01-27 00:00,      5
2013-01-27 01:00,     15
2013-01-27 02:00,     20
2013-01-27 03:00,      0
...
2013-01-27 23:00,     14
2013-01-28 00:00,     15
...

因此,hour00-hour23 列中的每个值都对应于在 date+hourXX 采集的样本。

我知道如何在 sql 中执行此操作,我将在其中创建 24 个 UNION ALL,每个选择一列,但是在R中是否有一种“智能”的方式来执行此操作(或者可能是一些甚至知道更好的方式的专家)这在 sql 中)。

作为一个额外的问题,有没有办法反过来(采用时间序列并将其转换为 hour00-hour23 格式)?

4

2 回答 2

1

这是一种蛮力方法。它正在使用您的示例,小时数为 c(0:3,23)。请注意函数第一行的注释,以便在一天中的所有时间都存在时重塑数据。

f <- function(df) {
  hours <- paste0('hour', sprintf('%02d', c(0:3,23)))  ## paste0('hour', sprintf('%02d', 0:23))
  df <- reshape(df, direction='long', varying=hours, sep='')[c('date', 'time', 'hour')]
  df[['date-time']] <- paste0(df$date, ' ', sprintf('%02d', df$time), ':00')
  df <- df[c('date-time', 'hour')]
  df[order(df[['date-time']]),]
}

df <- read.csv(header=T, text="      date, total, avg, hour00, hour01, hour02, hour03, hour23
2013-01-27,   240,  10,      5,     15,     20,      0, 14
2013-01-28,   305,  15,      9,     18,     17,     12, 16")

f(df)
##             date-time hour
## 1.0  2013-01-27 00:00    5
## 1.1  2013-01-27 01:00   15
## 1.2  2013-01-27 02:00   20
## 1.3  2013-01-27 03:00    0
## 1.23 2013-01-27 23:00   14
## 2.0  2013-01-28 00:00    9
## 2.1  2013-01-28 01:00   18
## 2.2  2013-01-28 02:00   17
## 2.3  2013-01-28 03:00   12
## 2.23 2013-01-28 23:00   16
于 2013-01-28T04:59:22.750 回答
0

这就是我猜你想要的。如果没有,那么请发布一个更好地代表问题的示例:

require(zoo)
txt <- scan(textConnection("2013-01-27, 240, 10, 5, 15, 20, 0"), what="character", sep=",") vals=txt[-(1:2)]> dt <- as.POSIXct(txt[1], format="%Y-%m-%d")
zoo(vals, order.by=seq(dt, by="1 hour", length=length(vals) ) )

2013-01-27 00:00:00 2013-01-27 01:00:00 2013-01-27 02:00:00 
                 10                   5                  15 
2013-01-27 03:00:00 2013-01-27 04:00:00 
                 20                   0 
于 2013-01-27T04:32:43.570 回答