Интерполировать данные в третьем столбце с помощью регулярного ряда POSIXct? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть фрейм данных со столбцом 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

Надеюсь, это достаточно ясно. Дайте мне знать, если вам нужна дополнительная информация.

1 Ответ

0 голосов
/ 26 апреля 2019

Это приближение может быть хорошим:

Сначала я создал фрейм данных со всеми временными метками в желаемом интервале.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...