将缺失值的 xts 对象平均到每小时端点

Average xts object with missing values to hourly endpoints

我正在使用 xts 转换为每小时平均数据。我从一年的 10 分钟数据开始。有些小时有一个 10 分钟的时间段(例如第 229 行中的 'UTSP'),即 NA(缺失)。

对于这样的时间,我仍然想要可用数据的平均值,但是在输出中我得到了该小时的变量 NA

其他时间可能没有数据(所有数据都缺失)。我希望这些完全缺失的时间达到 return NA,但是如果某些数据存在一个小时,我希望使用该数据。

这是我一直在尝试的可重现示例:

Lines <- "date,time,UTSP,UPM10,UPM25,UPM1,UWS,UWDT,PTSP,PPM10,PPM25,PPM1,PWS,PWDT
218,2014/10/15,22:00,9.7,4.9,4.66,1.54,6,152.56,102,53.6,33.71,10.34,NA,NA
219,2014/10/15,22:10,9.3,5.1,4.57,1.61,6.4,147.56,106.4,55.1,33.92,10.47,NA,NA
220,2014/10/15,22:20,8.9,5,4.7,1.55,6.4,147.56,108.3,54.8,33.19,10.53,NA,NA
221,2014/10/15,22:30,9.7,5.3,4.93,1.62,6.8,152.56,110.3,57.4,34.97,11.14,NA,NA
222,2014/10/15,22:40,9.1,5.2,4.76,1.54,6.8,152.56,118.9,62.3,37.58,11.63,NA,NA
223,2014/10/15,22:50,9.8,5.5,5.07,1.62,6.7,152.56,120.5,61.8,36.24,11.9,NA,NA
224,2014/10/15,23:00,11.1,5.6,5.2,1.59,6.4,152.56,108.6,57.1,34.93,11.66,NA,NA
225,2014/10/15,23:10,9.8,5.4,4.89,1.63,7.3,152.56,116,59.6,35.08,11.14,NA,NA
226,2014/10/15,23:20,9.1,5,4.95,1.63,7.1,152.56,122.6,63.8,38.28,12.17,NA,NA
227,2014/10/15,23:30,9.7,5.2,4.88,1.58,7.3,147.56,88.1,46.7,29.59,9.78,NA,NA
228,2014/10/15,23:40,9.2,5.2,4.79,1.66,7.1,152.56,92.4,48.8,30.11,9.69,NA,NA
229,2014/10/15,23:50,NA,NA,NA,NA,NA,NA,89.7,48.1,30.53,9.89,NA,NA
230,2014/10/16,00:00,9.8,5.5,5.03,1.6,7,147.56,91.2,47.5,30.09,9.38,NA,NA
231,2014/10/16,00:10,9.7,5.1,4.81,1.57,7.1,152.56,91.2,47.6,29.44,9.4,NA,NA
232,2014/10/16,00:20,9.9,5.4,5.09,1.61,7.4,147.56,91.1,48.3,29.78,9.23,NA,NA
233,2014/10/16,00:30,9.8,5.4,4.82,1.62,6.9,152.56,95.7,48.6,29.47,9.8,NA,NA
234,2014/10/16,00:40,10.6,5.7,4.99,1.58,6.8,147.56,91.3,47.9,29.57,9.94,NA,NA
235,2014/10/16,00:50,10.1,5.4,4.93,1.65,7,147.56,86.3,44.9,27.9,8.93,NA,NA"
conn <- textConnection(Lines)
dframe <- read.csv(conn)
close(conn)

library(xts) 
USP_TSP.xts <- xts(dframe$UTSP,
    as.POSIXct(paste(dframe$date,dframe$time), format="%Y/%m/%d %H:%M")) 
na.exclude(USP_TSP.xts)
ep <- endpoints(USP_TSP.xts,'hours') 
period.apply(USP_TSP.xts,ep,mean) 

我也尝试了 na.contiguousna.omitna.action 的几种变体。

我的结果输出似乎总是相同的(摘录):

                           [,1]
2014-10-15 22:50:00   9.4166667
2014-10-15 23:50:00          NA
2014-10-16 00:50:00   9.9833333

... 2014-10-15 小时 23 的值为 NA,即使 6 个非缺失值中有 5 个

此外,我正在分别计算所有列,然后再将它们合并。有没有更简单的方法 - 比如一次计算所有列?

调用 na.exclude 不会更改 USP_TSP.xts 对象。您需要将 na.exclude 的输出分配给 USP_TSP.xts 才能实现。

USP_TSP.xts <- na.exclude(USP_TSP.xts)

但是如果您想一次处理对象中的所有列,使用 na.exclude 将删除至少有一列缺失值的所有行。

xData <- xts(dframe[,-(1:2)],
    as.POSIXct(paste(dframe$date,dframe$time), format="%Y/%m/%d %H:%M")) 
na.exclude(xData)
#      UTSP UPM10 UPM25 UPM1 UWS UWDT PTSP PPM10 PPM25 PPM1 PWS PWDT
str(na.exclude(xData))
# An 'xts' object of zero-width

相反,您应该在 period.apply 调用中为对 mean 的调用提供 na.rm=TRUE。如果要同时处理所有列,可以使用colMeans.

xDataMeans <- period.apply(xData, endpoints(xData, "hours"), colMeans, na.rm=TRUE)
xDataMeans
#                         UTSP    UPM10    UPM25  UPM1      UWS     UWDT
# 2014-10-15 22:50:00 9.416667 5.166667 4.781667 1.580 6.516667 150.8933
# 2014-10-15 23:50:00 9.780000 5.280000 4.942000 1.618 7.040000 151.5600
# 2014-10-16 00:50:00 9.983333 5.416667 4.945000 1.605 7.033333 149.2267
#                          PTSP    PPM10    PPM25      PPM1 PWS PWDT
# 2014-10-15 22:50:00 111.06667 57.50000 34.93500 11.001667 NaN  NaN
# 2014-10-15 23:50:00 102.90000 54.01667 33.08667 10.721667 NaN  NaN
# 2014-10-16 00:50:00  91.13333 47.46667 29.37500  9.446667 NaN  NaN

您的代码运行良好。您只需分配 USP_TSP.xts <- na.exclude(USP_TSP.xts)。如果你只是调用 na.exclude(USP_TSP.xts),那么没有 NA 的输出会被打印出来,但它不会存储在任何变量中。

USP_TSP.xts <- na.exclude(USP_TSP.xts)
ep <- endpoints(USP_TSP.xts,'hours') 
period.apply(USP_TSP.xts,ep,mean) 
#                        [,1]
#2014-10-15 22:50:00 9.416667
#2014-10-15 23:40:00 9.780000
#2014-10-16 00:50:00 9.983333

或者,如果您不想修改原始 xts 对象,您可以使用 period.apply(USP_TSP.xts,ep,mean, na.rm=T)