将在不规则时间收集的数据转换为R中的时间序列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将在不规则时间收集的数据转换为R中的时间序列相关的知识,希望对你有一定的参考价值。

我有春季和夏季(月份:5,6,7,8)收集的多变量数据,不一定是每天,也不是30年。如何将其转换为时间序列对象以进行时间序列分析?

我试过:timeseries < - ts(数据,开始(2017,5),频率= 4)

但是我不知道它的频率是多少,因为它每年收集4次而不是“季刊”。

这就是数据的样子:

    Year  Month Day   ID     Size      Sex      Temperature
    1 2017     5  13  033     54.0       M        13.0
    2 2017     5  15  044     53.5       F        11.0
    3 2017     5  16  141     55.8       M        15.7

我想也许我将不得不在缺少收集数据的月份和日期的数据中添加NA。我也不知道如何划分每年的每天和每月......

答案

1)使用最后注释中显示的数据(稍微改变一下)从温度创建一个动物园系列,其时间为年+(月-5)/ 4,通过使用mean减少一个月内的多个值,然后转换所有这对ts

library(zoo)
toYearMon <- function(x) x[[1]] + (x[[2]] - 5)/4
z <- read.zoo(DF[c("Year", "Month", "Day", "Temperature")], index = 1:3, 
  FUN = toYearMon, aggregate = mean)
as.ts(z)
##      Qtr1 Qtr2
## 2017 12.0 15.7

ts会认为4个月是四分之一,但希望你可以忍受这个。或者使用z

2)另一种可能性,因为从5月1日到8月31日包括123天,是创建一个时间变量,即5月1日的年+ 0,5月2日的年+ 1/123,...,8月31日的年+ 122/123。

toDate <- function(x) as.Date(paste(x[[1]], x[[2]], x[[3]], sep = "-"))

sinceMay1 <- function(x) {
  d <- toDate(x)
  may1 <- toDate(data.frame(x[[1]], 5, 1))
  x[[1]] + as.numeric(d - may1) / 123
}

zsm <- read.zoo(DF[c("Year", "Month", "Day", "Temperature")], index = 1:3,
  FUN = sinceMay1)
frequency(zsm) <- 123

现在我们可以使用zsmas.ts(zsm)

3)另一种可能性,如果它足够好,可以使用1,2,3,....

ts(DF$Temperature)

4)我们可以创建一个像这样的动物园系列,其中toDate来自上面:

read.zoo(DF[c("Year", "Month", "Day", "Temperature")], index = 1:3,
  FUN = toDate)

注意

我们将上个月改为6。

Lines <- "Year  Month Day   ID     Size      Sex      Temperature
    1 2017     5  13  033     54.0       M        13.0
    2 2017     5  15  044     53.5       F        11.0
    3 2017     6  16  141     55.8       M        15.7"
DF <- read.table(text = Lines)

以上是关于将在不规则时间收集的数据转换为R中的时间序列的主要内容,如果未能解决你的问题,请参考以下文章

根据 R 中的时间间隔对数据进行分组并分配组 ID

比较 R 中的数据集

如何在R中的数据框中转换日期/时间列

为啥 R lubridate::duration 数据类型使用 sparklyr 转换为 spark 中的字符?

将数据框转换为 R 失业中的时间序列

如何将字节数组附加到Go中的字节片[重复]