【问题标题】:Create Regular time series from an irregular (as.Date) time series with frequency=23从频率 = 23 的不规则(as.Date)时间序列创建规则时间序列
【发布时间】:2011-06-16 14:38:01
【问题描述】:

我在 R 中有以下问题。我想从不规则时间序列(即日期和数据值列表)创建一个 ts() 对象(即规则时间序列)。

您可以使用以下数据集和 R 脚本重现该问题:

# dput(dd) result    
dd <- structure(list(NDVI = structure(c(14L, 4L, 11L, 12L, 20L, 17L, 
    5L, 7L, 21L, 23L, 25L, 19L, 15L, 9L, 3L, 24L, 2L, 6L, 22L, 16L, 
    13L, 18L, 10L, 8L, 1L), .Names = c("1", "2", "3", "4", "5", "6", 
    "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", 
    "18", "19", "20", "21", "22", "23", "24", "25"), .Label = c("0.4186", 
    "0.5452", "0.5915", "0.5956", "0.6010", "0.6860", "0.6966", "0.7159", 
    "0.7161", "0.7264", "0.7281", "0.7523", "0.7542", "0.7701", "0.7751", 
    "0.7810", "0.7933", "0.8075", "0.8113", "0.8148", "0.8207", "0.8302", 
    "0.8305", "0.8369", "0.9877"), class = "factor"), DATUM = structure(c(11005, 
    11021, 11037, 11085, 11101, 11117, 11133, 11149, 11165, 11181, 
    11197, 11213, 11229, 11245, 11261, 11277, 11293, 11309, 11323, 
    11339, 11355, 11371, 11387, 11403, 11419), class = "Date")), .Names = c("NDVI", 
    "DATUM"), row.names = c("1", "2", "3", "4", "5", "6", "7", "8", 
    "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", 
    "20", "21", "22", "23", "24", "25"), class = "data.frame")

require(zoo)
dd$DATUM <- as.Date(dd$DATUM,"A%Y%j") # Ayear,julianday
z <- zoo(dd$NDVI,dd$DATUM,frequency=23)
z  # this is a regular time series with a frequency=23 and start=c(2000,1)
# there are 5 measurements in 2000 (2 jan, 1 feb, 2 apr) for which no data is available 
# this should be marked as an NA is the final regular time series
ts.z <- as.ts(z,start=c(2000,1),frequency=23)

但这不起作用,因为我获得了一个包含每日时间步长的非常长的常规时间序列。 我想获得一个频率为 23 的 ts 对象,正确指示其数据不可作为 NA 的位置。

我一直在尝试根据此处列出的示例获取年度数据 Convert a irregular time series to a regular time series

但它不适用于频率为 23 的数据(即一年 23 个值)。我想我可以通过避免设置 dd$DATUM as.Date() 来解决这个问题,但是作为一个动物园对象,可以作为一个每年有 23 个值的时间序列进行排序。

有什么想法吗?

感谢您的帮助

【问题讨论】:

    标签: datetime r time-series zoo


    【解决方案1】:

    23 不能平均划分为一年中的天数,因此您必须综合自己的时间尺度,以便将每年划分为 23 个相等的部分。将dd(具有“日期”课程时间的版本)转换为动物园并根据由年份加上分数组成的新比例创建一个新系列。最后将其转换为 ts 系列:

    library(zoo)
    z <- zoo(as.numeric(as.character(dd[[1]])), dd[[2]]) 
    lt <- unclass(as.POSIXlt(time(z)))
    yr <- lt$year + 1900
    jul <- lt$yday
    delta <- min(unlist(tapply(jul, yr, diff))) # 16
    zz <- aggregate(z, yr + jul / delta / 23)
    
    as.ts(zz)
    

    给予:

    Time Series:
    Start = c(2000, 4) 
    End = c(2001, 7) 
    Frequency = 23 
     [1] 0.7701 0.5956 0.7281     NA     NA 0.7523 0.8148 0.7933 0.6010 0.6966
    [11] 0.8207 0.8305 0.9877 0.8113 0.7751 0.7161 0.5915 0.8369 0.5452 0.6860
    [21] 0.8302 0.7810 0.7542 0.8075 0.7264 0.7159 0.4186
    

    【讨论】:

    • 是的。这看起来不错,但由于变量 zt 没有定义,它还不能在这里工作。 ps 为什么要除以 16?感谢您的帮助。
    • @Jan 我相信他会修复它,但我的猜测是 zt
    • @Jan,正如比尔指出的那样,zt 是时间(z),但从那时起我已经简化并清理了代码,从而消除了它。 16 来自于 diff(time(z)) 表明这些点相隔 16 天或 16 天的倍数。
    • 效果很好!美丽的解决方案。多谢了。这些数据实际上是 MODIS 卫星数据,它被汇总(合成)为 16 天的时间步长。这是创建常规时间序列(ts 类)的智能解决方案。干杯
    • 已经添加了一个计算得到16,以便该值更合理。
    猜你喜欢
    • 2012-05-12
    • 2021-01-08
    • 2016-04-07
    • 2011-04-23
    • 2016-03-14
    • 2014-09-02
    • 2023-01-20
    • 2013-11-07
    • 1970-01-01
    相关资源
    最近更新 更多