【问题标题】:Detecting & Testing if the data is regularly spaced in R检测和测试数据是否在 R 中定期间隔
【发布时间】:2015-02-22 19:15:07
【问题描述】:

我有以下时间序列。这是一个子集,实时序列有 420,000 行。

问题:检测和测试数据是否规则间隔。

        USAF  WBAN        YR--MODAHRMN DIR
 1950 723890 93193 1972-08-31 15:00:00 280
 1951 723890 93193 1972-08-31 18:00:00 090
 1952 723890 93193 1972-08-31 21:00:00 150
 1953 723890 93193 1972-09-01 00:00:00 240 
 1954 723890 93193 1972-09-01 01:00:00 300
 1955 723890 93193 1972-09-01 02:00:00 290

我们需要检查的列是“YR--MODAHRMN”,即:

 class(sdf$"YR--MODAHRMN")
 [1] "POSIXlt" "POSIXt" 

在 1952 年观察之前,时间序列每 3 小时拍摄一次,1953 年之后,每 1 小时拍摄一次。

预期结果:我希望 R 告诉我:“是的,数据是每小时数据”或“不,数据不是每小时。1953 年有一个中断”或类似的东西。我只是想确保我的其余数据是每小时数据而不是混合数据

如果时间序列是等距的,是否有任何方法可以在 R 中进行测试。我只需要每小时的观察,但当然,我不能一一检查420,000个观察吗?谢谢

【问题讨论】:

  • 您可以检查?diff 尝试df1[c(diff(df1$SPD)==1, TRUE),] 或一些时间变化,因为不清楚您需要从示例中子集哪些行
  • 我不需要子集。我需要 R 告诉我“是的,其余的是每小时数据”或“不,并非所有内容都是每小时数据”,并且可能告诉我中断发生在哪里
  • 请更新预期的结果,这样会更清楚
  • 更新了问题以反映您所说的内容。必须有一个时间序列包来解决这个问题,但我找不到它

标签: r dataframe time-series


【解决方案1】:

如果系列是规则间隔的,那么只有一个区别,所以试试这个:

# test data
ch <- c("1972-08-31 15:00:00", "1972-08-31 18:00:00", "1972-08-31 21:00:00", 
"1972-09-01 00:00:00", "1972-09-01 01:00:00", "1972-09-01 02:00:00")
p <- as.POSIXct(ch)

length(unique(diff(p)))
## [1] 2

如果长度为 1,则它是规则间隔的,如果 > 1 则不是。在这种情况下,差异都是 1 或 3 小时;因此,唯一差异的数量是2,因此它不是规则间隔的。 (我们可以检查unique(diff(p)) 看看有什么区别。)

(请注意,zoo 包有一个名为 is.regular 的函数;但是,它的用途略有不同。如果一个序列是规则间隔的,除非可能存在一些缺失值,否则它会将序列视为规则序列。在此处的示例数据中 @987654325 @ 会认为该系列是有规律的,因为如果用两个相隔 1 的值填充相距 3 的点,那么它将有规律地间隔。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多