R - Gap填写时间序列

时间:2016-08-23 10:28:33

标签: r timestamp time-series

我试图通过将一整天的时间序列合并到我原来的时间序列来填补我的一个时间序列中的空白。但由于某种原因,我得到重复的条目,我的所有其余数据都是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的结果。前8分钟在时间戳列中是重复的,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"))))))

非常简单有效!

2 个答案:

答案 0 :(得分:0)

而不是merge使用rbind而不是NA来为您提供不规则的时间序列。如果你真的想要一个频率为1分钟的常规时间序列,你可以建立一个基于时间的序列作为索引,然后在merge之后使用你的数据rbind并填充结果{ {1}} NA。希望这会有所帮助。

答案 1 :(得分:0)

您可以尝试与full_join

中的tidyverse合并

这对我来说有两个数据帧(每日值)共享一个名为date的列。

big_data<-my_data %>%
  reduce(full_join, by="Date")
相关问题