通过常规 POSIXct 系列在第三列中插入数据?

Interpolating data in third column by a regular POSIXct series?

我有一个包含 POSIXct 列和数据列的数据框(在本例中以雨为例)。目前 POSIXct 时间序列是不规则的(即有时每秒一次,有时每三或两秒一次)。在真实数据集中,雨列在这里更有意义,我只是创建了一组随机数字。

设置一个有规律的间隔df为例

df  <- data.frame(Time = seq.POSIXt(from = as.POSIXct("2018-09-04 
10:56:12"), to = as.POSIXct("2018-09-04 10:57:12"), by = "sec"), rain = 
rnorm(61,2,3))

采样 df 所以我们有一个不规则的时间序列,这就是实际数据的样子

df <- data.frame(Time = df[sample(nrow(df),30),])

但是,我需要有一个固定间隔的时间序列(每 2 秒一次)。也许通过获取开始和结束的 POSIXct 数据点,然后从与已创建的 POSIXct 间隔相对应的雨柱中插入数据。

所以基本上,如果我们从 10:56:12 开始,下一个时间步长将在 10:56:14。理想情况下,该脚本会检查 14 是否存在,如果不存在,则会创建合适的时间戳并在两个最近的降雨数据点之间进行插值。

在这个假设的例子中,10:56:14 不存在于 df 中。它现在已经创建,并且在给定两个最近的邻居(平均值)的情况下对降雨数据点进行了插值。

Time                rain
2018-09-04 10:56:12 1.309069
2018-09-04 10:56:14 2.731635            
2018-09-04 10:56:16 4.154202

我希望这已经足够清楚了。如果您需要更多信息,请告诉我。

这个近似值可以很好:

首先,我创建了一个数据框,其中包含所需时间间隔内的所有时间戳。

start  = as.POSIXct("2018-09-04 10:56:12")
end    = as.POSIXct("2018-09-04 10:57:12")
step = 3 #seconds (can be 2 seconds too!)

dummy.df  <- seq(start, end, step) 
dummy.df  <- as.data.frame(dummy.df)
colnames(dummy.df) <- c("time")

看起来像这样:

                  time
1  2018-09-04 10:56:12
2  2018-09-04 10:56:15
3  2018-09-04 10:56:18
4  2018-09-04 10:56:21
5  2018-09-04 10:56:24
6  2018-09-04 10:56:27
7  2018-09-04 10:56:30
8  2018-09-04 10:56:33
9  2018-09-04 10:56:36
10 2018-09-04 10:56:39
11 2018-09-04 10:56:42
12 2018-09-04 10:56:45
13 2018-09-04 10:56:48
14 2018-09-04 10:56:51
15 2018-09-04 10:56:54
16 2018-09-04 10:56:57
17 2018-09-04 10:57:00
18 2018-09-04 10:57:03
19 2018-09-04 10:57:06
20 2018-09-04 10:57:09
21 2018-09-04 10:57:12

然后我创建了一个损坏的数据框来模拟你的问题:

#Lets say this is our original broken df, (with loses)
original.df <- dummy.df
original.df$V2 <- rnorm(nrow(original.df), 2,3) #Some fake data
original.df <- original.df[-c(5,6,10,15,16), ] #Introduce lost observations
colnames(original.df) <- c("time", "rain")

看起来像这样

                  time       rain
1  2018-09-04 10:56:12  2.0962818
2  2018-09-04 10:56:15 -4.6536048
3  2018-09-04 10:56:18  6.2995354
4  2018-09-04 10:56:21 -0.2378457
7  2018-09-04 10:56:30  3.8020177
8  2018-09-04 10:56:33 -5.7051945
9  2018-09-04 10:56:36  8.8737618
11 2018-09-04 10:56:42  3.9543532
12 2018-09-04 10:56:45 -3.8187967
13 2018-09-04 10:56:48  2.6197517
14 2018-09-04 10:56:51  8.3323757
17 2018-09-04 10:57:00  0.5615195
18 2018-09-04 10:57:03  1.4699787
19 2018-09-04 10:57:06 11.1171002
20 2018-09-04 10:57:09  0.7372780
21 2018-09-04 10:57:12  0.3441350

接下来我合并了数据帧:

#Merge 
df.merged<-merge(original.df, dummy.df, by = "time", all = T)
colnames(df.merged) <- c("time", "rain")

然后我得到:

                  time       rain
1  2018-09-04 10:56:12  0.1243183
2  2018-09-04 10:56:15 -1.4254425
3  2018-09-04 10:56:18  3.1908882
4  2018-09-04 10:56:21  2.5210609
5  2018-09-04 10:56:24         NA
6  2018-09-04 10:56:27         NA
7  2018-09-04 10:56:30 -1.7984547
8  2018-09-04 10:56:33  1.0511725
9  2018-09-04 10:56:36  2.2908755
10 2018-09-04 10:56:39         NA
11 2018-09-04 10:56:42 -1.1524531
12 2018-09-04 10:56:45  1.2960848
13 2018-09-04 10:56:48  4.3809223
14 2018-09-04 10:56:51  0.1184004
15 2018-09-04 10:56:54         NA
16 2018-09-04 10:56:57         NA
17 2018-09-04 10:57:00 -3.3740135
18 2018-09-04 10:57:03 -7.1360918
19 2018-09-04 10:57:06  1.7078348
20 2018-09-04 10:57:09 -1.8903507
21 2018-09-04 10:57:12  2.5735402

最后,我使用 na.approx 的线性方法进行插值:

#Interpolate NAs
df.merged$rain<-na.approx(df.merged$rain, method = "linear", rule=2)

这是期望的输出:

                  time       rain
1  2018-09-04 10:56:12  0.1243183
2  2018-09-04 10:56:15 -1.4254425
3  2018-09-04 10:56:18  3.1908882
4  2018-09-04 10:56:21  2.5210609
5  2018-09-04 10:56:24  1.0812224
6  2018-09-04 10:56:27 -0.3586162
7  2018-09-04 10:56:30 -1.7984547
8  2018-09-04 10:56:33  1.0511725
9  2018-09-04 10:56:36  2.2908755
10 2018-09-04 10:56:39  0.5692112
11 2018-09-04 10:56:42 -1.1524531
12 2018-09-04 10:56:45  1.2960848
13 2018-09-04 10:56:48  4.3809223
14 2018-09-04 10:56:51  0.1184004
15 2018-09-04 10:56:54 -1.0457376
16 2018-09-04 10:56:57 -2.2098755
17 2018-09-04 10:57:00 -3.3740135
18 2018-09-04 10:57:03 -7.1360918
19 2018-09-04 10:57:06  1.7078348
20 2018-09-04 10:57:09 -1.8903507
21 2018-09-04 10:57:12  2.5735402