【问题标题】:R - Gap fill a time seriesR - 填补时间序列
【发布时间】:2016-12-30 03:12:33
【问题描述】:

我试图通过将一整天的时间序列合并到我的原始时间序列中来填补我的一个时间序列中的空白。但是由于某种原因,我得到了重复的条目,而我的所有其余数据都是 NA。 我的数据如下所示:

> head(data)
                 TIME Water_Temperature
1 2016-08-22 00:00:00            81.000
2 2016-08-22 00:01:00            80.625
3 2016-08-22 00:02:00            85.000
4 2016-08-22 00:03:00            80.437
5 2016-08-22 00:04:00            85.000
6 2016-08-22 00:05:00            80.375

> tail(data)
                    TIME Water_Temperature
1398 2016-08-22 23:54:00              19.5
1399 2016-08-22 23:55:00              19.5
1400 2016-08-22 23:56:00              19.5
1401 2016-08-22 23:57:00              19.5
1402 2016-08-22 23:58:00              19.5
1403 2016-08-22 23:59:00              19.5

中间缺少一些分钟(1403 行而不是 1440 行)。我尝试使用:

data.length <- length(data$TIME)
time.min <- data$TIME[1]
time.max <- data$TIME[data.length]
all.dates <- seq(time.min, time.max, by="min")
all.dates.frame <- data.frame(list(TIME=all.dates))
merged.data <- merge(all.dates.frame, data, all=T)

但这给了我 1449 行而不是 1440 行的结果。前八分钟在时间戳列中是重复的,Water_Temperature 中的所有其他值都是NA。看起来像这样:

> merged.data[1:25,]
                  TIME Water_Temperature
1  2016-08-22 00:00:00                NA
2  2016-08-22 00:00:00            81.000
3  2016-08-22 00:01:00                NA
4  2016-08-22 00:01:00            80.625
5  2016-08-22 00:02:00                NA
6  2016-08-22 00:02:00            85.000
7  2016-08-22 00:03:00                NA
8  2016-08-22 00:03:00            80.437
9  2016-08-22 00:04:00                NA
10 2016-08-22 00:04:00            85.000
11 2016-08-22 00:05:00                NA
12 2016-08-22 00:05:00            80.375
13 2016-08-22 00:06:00                NA
14 2016-08-22 00:06:00            80.812
15 2016-08-22 00:07:00                NA
16 2016-08-22 00:07:00            80.812
17 2016-08-22 00:08:00                NA
18 2016-08-22 00:08:00            80.937
19 2016-08-22 00:09:00                NA
20 2016-08-22 00:10:00                NA
21 2016-08-22 00:11:00                NA
22 2016-08-22 00:12:00                NA
23 2016-08-22 00:13:00                NA
24 2016-08-22 00:14:00                NA
25 2016-08-22 00:15:00                NA

> tail(merged.data)
                    TIME Water_Temperature
1444 2016-08-22 23:54:00                NA
1445 2016-08-22 23:55:00                NA
1446 2016-08-22 23:56:00                NA
1447 2016-08-22 23:57:00                NA
1448 2016-08-22 23:58:00                NA
1449 2016-08-22 23:59:00                NA

有人知道出了什么问题吗?

编辑:

现在使用 xts 和 zoo 包通过以下方式完成工作:

library(xts)
library(zoo)

df1.zoo<-zoo(data[,-1],data[,1])
df2 <- as.data.frame(as.zoo(merge(as.xts(df1.zoo), as.xts(zoo(,seq(start(df1.zoo),end(df1.zoo),by="min"))))))

非常简单有效!

【问题讨论】:

    标签: r timestamp time-series


    【解决方案1】:

    不要使用merge,而是使用rbind,它会给你一个不规则的时间序列,而没有NAs 开始。如果您真的想要一个频率为 1 分钟的常规时间序列,您可以构建一个基于时间的序列作为索引,然后使用您的数据 merge 它(在使用 rbind 之后)并用生成的 NAs 填充na.locf。希望这会有所帮助。

    【讨论】:

    • 这并没有改变问题。之后我可以删除重复的,但我仍然会丢失所有其他数据,因为它们已被 NA 替换。
    • 好的,我可以稍后再试。但是现在我用 zoo 和 xts 编辑的版本工作得很好。澄清一下,我想要 NA 填补时间序列的空白。但是我的第一种方法也用 NA 覆盖了 Water_Temperature 中的所有其他值。
    【解决方案2】:

    你可以尝试从tidyversefull_join合并

    这适用于我,两个数据框(每日值)共享一个名为 date 的列。

    big_data<-my_data %>%
      reduce(full_join, by="Date")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-05
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      相关资源
      最近更新 更多