Using xts with timespans crossing calendar dates:How to use period.apply (xts) or POSIXct datetime arguments in these cases in R?

Using xts with timespans crossing calendar dates: How to use period.apply (xts) or POSIXct datetime arguments in these cases in R?

我在将函数 (min) 应用于特定的重复时间段时遇到问题。基本上我的数据在那个样本中看起来像:

library(xts)
start <- as.POSIXct("2018-05-18 00:00")
tseq <- seq(from = start, length.out = 1440, by = "10 mins")
Measurings <- data.frame(
  Time = tseq,
  Temp = sample(10:37,1440, replace = TRUE, set.seed(seed = 10)))
)
Measurings_xts <- xts(Measurings[,-1], Measurings$Time)

在非常感谢的帮助 () 的帮助下,我设法发现 minmax 函数(与 mean 相反,它们立即在 period.apply) 必须由辅助函数定义,然后可以使用以下解决方案计算逻辑日期时间参数(小时、天、年...):

colMin <- function(x, na.rm = FALSE) {
  apply(x, 2, min, na.rm = na.rm)
}

epHours <- endpoints(Measurings_xts, "hours")
Measurings_min <- period.apply(Measurings_xts, epHours, colMin)

对于气象分析,我需要为不太直观的时间跨度计算进一步的最小值,跨越日历日,我无法在代码中定义:

我需要输出最低夜间温度,例如在我的数据集中,每个晚上的早上 2018-05-18 19:002018-05-19 7:00

我试图通过向上或向下操纵(移动)时间列来移动时间跨度,以将夜间包括在一个日历日中。由于此解决方案容易出错并且不适用于我的真实数据,其中缺少一些观察结果。在这种情况下,如何使用 POSIXct datetime and/or xts 功能来计算最小值?

这是一种通过为每个夜间间隔定义一个新组来工作的方法

# define the time interval, e.g. from 19:00 to 7:00
from <- 19
to <- 7
hours <- as.numeric(strftime(index(Measurings_xts), format="%H"))
y <- rle(as.numeric(findInterval(hours, c(to,from)) != 1))
y$values[c(TRUE, FALSE)] <-  cumsum(y$values[c(TRUE, FALSE)])
grp <- inverse.rle(y)
# grp is a grouping variable that is 0 for everything outside the 
# defined interval , 1 for the first night, 2 for the second...


s <- split(Measurings_xts, grp); s$`0` <- NULL
# min_value will contain the minimum value for each night interval 
min_value <- sapply(s, min)

# to see the date interval for each value
start <- sapply(s, function(x) as.character(index(x)[1]))
end <- sapply(s, function(x) as.character(index(x)[length(x)]))
data.frame(start, end, min_value)

#                start                 end   min_value
#1           2018-05-18 2018-05-18 06:50:00         10
#2  2018-05-18 19:00:00 2018-05-19 06:50:00         10
#3  2018-05-19 19:00:00 2018-05-20 06:50:00         10
#4  2018-05-20 19:00:00 2018-05-21 06:50:00         10
#5  2018-05-21 19:00:00 2018-05-22 06:50:00         10
#6  2018-05-22 19:00:00 2018-05-23 06:50:00         10
#7  2018-05-23 19:00:00 2018-05-24 06:50:00         11
#8  2018-05-24 19:00:00 2018-05-25 06:50:00         10
#9  2018-05-25 19:00:00 2018-05-26 06:50:00         10
#10 2018-05-26 19:00:00 2018-05-27 06:50:00         10
#11 2018-05-27 19:00:00 2018-05-27 23:50:00         12

您可以通过在使用 period.apply

时创建自己的 "end points" 来解决此问题
# Choose the appropriate time ranges
z <- Measurings_xts["T19:00/T07:00"]
# Creating your own "endpoints":
epNights <- which(diff.xts(index(z), units = "mins") > 10) - 1

从每个索引中减去一个,因为跳转记录在 which().

的输出中下一个 "night interval" 的开始处

然后将数据集中的最后一个数据点添加到您的端点向量中,然后您可以在 period.apply

中使用它
epNights <- c(epNights, nrow(z))

Measurings_min <- period.apply(z, epNights, colMin)
Measurings_min
# [,1]
# 2018-05-18 07:00:00   10
# 2018-05-19 07:00:00   10
# 2018-05-20 07:00:00   10
# 2018-05-21 07:00:00   10
# 2018-05-22 07:00:00   10
# 2018-05-23 07:00:00   10
# 2018-05-24 07:00:00   11
# 2018-05-25 07:00:00   10
# 2018-05-26 07:00:00   10
# 2018-05-27 07:00:00   10
# 2018-05-27 23:50:00   12