通过常规 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
我有一个包含 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