在 R 中将 kWh 转换为 kW

converting kWh to kW in R

我有一个来自 kWh 表的数据,我想将其转换为 kW。这是我到目前为止所做的:

lines="timestamp,kwh
30-Nov-14 8:00:00 AM,23350
30-Nov-14 8:15:00 AM,23350
30-Nov-14 8:30:00 AM,23351
30-Nov-14 8:45:00 AM,23351
30-Nov-14 9:00:00 AM,23351
30-Nov-14 9:15:01 AM,23352
30-Nov-14 9:30:00 AM,23352
30-Nov-14 9:45:00 AM,23352
30-Nov-14 10:00:00 AM,23352
30-Nov-14 10:15:00 AM,23352
30-Nov-14 10:30:00 AM,23354
30-Nov-14 10:45:00 AM,23354
30-Nov-14 11:00:00 AM,23354
30-Nov-14 11:15:00 AM,23357
30-Nov-14 11:30:00 AM,23357
30-Nov-14 11:45:00 AM,23358
30-Nov-14 12:00:00 PM,23359
30-Nov-14 12:30:00 PM,23359
30-Nov-14 12:45:00 PM,23359
30-Nov-14 1:00:00 PM,23359"
df=read.table(text = lines, header = TRUE, sep = ",")
diff.kwh = diff(as.matrix(df$kwh))
# have to add NA so that the length is the same as df
df$diff.kwh=rbind("NA",diff.kwh)

library(zoo)
z = zoo(df[,2:3], as.POSIXct(df$timestamp, format="%d-%b-%y %I:%M:%S %p"))
z

我有以下内容:

    > z
                    kwh   diff.kwh
2014-11-30 08:00:00 23350 NA
2014-11-30 08:15:00 23350 0
2014-11-30 08:30:00 23351 1
2014-11-30 08:45:00 23351 0
2014-11-30 09:00:00 23351 0
2014-11-30 09:15:01 23352 1
2014-11-30 09:30:00 23352 0
2014-11-30 09:45:00 23352 0
2014-11-30 10:00:00 23352 0
2014-11-30 10:15:00 23352 0
2014-11-30 10:30:00 23354 2
2014-11-30 10:45:00 23354 0
2014-11-30 11:00:00 23354 0
2014-11-30 11:15:00 23357 3
2014-11-30 11:30:00 23357 0
2014-11-30 11:45:00 23358 1
2014-11-30 12:00:00 23359 1
2014-11-30 12:30:00 23359 0
2014-11-30 12:45:00 23359 0
2014-11-30 13:00:00 23359 0

我需要做的是获取diff.kwh列的(非零)值,然后将每个非零值除以前面零的(时间)长度。这就是我被困的地方。任何帮助将不胜感激。

下面是基于数据框的解决方案:

# Parse timestamp
df$timestamp.2 <- as.POSIXct(df$timestamp, format="%d-%b-%y %I:%M:%S %p")

# Select records with non-zero diff.kwh
df2 <- df[df$diff.kwh!=0,]

# Get the differences between the corresponding timestamps
df2$delta.t <- c(NA,diff(df2$timestamp.2))

df2$kW <- with(df2,as.numeric(diff.kwh)/delta.t*60)

我使用的是上面 Marat Talipov 的答案,我粘贴在这里是为了让人们知道我需要的最终结果。这是:

lines="timestamp,kwh
30-Nov-14 8:00:00 AM,23350
30-Nov-14 8:15:00 AM,23350
30-Nov-14 8:30:00 AM,23351
30-Nov-14 8:45:00 AM,23351
30-Nov-14 9:00:00 AM,23351
30-Nov-14 9:15:01 AM,23352
30-Nov-14 9:30:00 AM,23352
30-Nov-14 9:45:00 AM,23352
30-Nov-14 10:00:00 AM,23352
30-Nov-14 10:15:00 AM,23352
30-Nov-14 10:30:00 AM,23354
30-Nov-14 10:45:00 AM,23354
30-Nov-14 11:00:00 AM,23354
30-Nov-14 11:15:00 AM,23357
30-Nov-14 11:30:00 AM,23357
30-Nov-14 11:45:00 AM,23358
30-Nov-14 12:00:00 PM,23359
30-Nov-14 12:30:00 PM,23359
30-Nov-14 12:45:00 PM,23359
30-Nov-14 1:00:00 PM,23359"
df=read.table(text = lines, header = TRUE, sep = ",")
diff.kwh = diff(as.matrix(df$kwh))
# have to add NA so that the length is the same as df
df$diff.kwh=rbind(NA,diff.kwh)
df

# Parse timestamp
df$timestamp.2 <- as.POSIXct(df$timestamp, format="%d-%b-%y %I:%M:%S %p")

# Select records with non-zero diff.kwh
df2 <- df[df$diff.kwh!=0,]

# Remove NAs
df2 <- df2[complete.cases(df2),]

# Add the first row of the original df, so that the first value of diff.kwh counts
df2 = rbind(df[1,],df2)

# Get the differences between the corresponding timestamps
df2$delta.t <- c(NA,diff(df2$timestamp.2))

# Calculate kw, delta.t is in minutes
df2$kw <- with(df2,diff.kwh*60/delta.t)

# Create zoo
library(zoo)
z1 = zoo(df[,2:3], as.POSIXct(df$timestamp, format="%d-%b-%y %I:%M:%S %p"))
z2 = zoo(df2$kw, df2$timestamp.2)
colnames(z2) = "kw"

# merge the two zoo, replacing NAs backward
z3 = na.locf(merge(z1,z2), fromLast=T)

这是我想要的结果:

> z3
                      kwh diff.kwh       kw
2014-11-30 08:00:00 23350        0 2.000000
2014-11-30 08:15:00 23350        0 2.000000
2014-11-30 08:30:00 23351        1 2.000000
2014-11-30 08:45:00 23351        0 1.332840
2014-11-30 09:00:00 23351        0 1.332840
2014-11-30 09:15:01 23352        1 1.332840
2014-11-30 09:30:00 23352        0 1.600356
2014-11-30 09:45:00 23352        0 1.600356
2014-11-30 10:00:00 23352        0 1.600356
2014-11-30 10:15:00 23352        0 1.600356
2014-11-30 10:30:00 23354        2 1.600356
2014-11-30 10:45:00 23354        0 4.000000
2014-11-30 11:00:00 23354        0 4.000000
2014-11-30 11:15:00 23357        3 4.000000
2014-11-30 11:30:00 23357        0 2.000000
2014-11-30 11:45:00 23358        1 2.000000
2014-11-30 12:00:00 23359        1 4.000000
2014-11-30 12:30:00 23359        0       NA
2014-11-30 12:45:00 23359        0       NA
2014-11-30 13:00:00 23359        0       NA