Как найти дату и время, которые не являются общими для двух больших фреймов данных - PullRequest
1 голос
/ 04 апреля 2019

У меня есть два больших кадра данных df1 и df2, которые теоретически должны иметь одинаковое количество строк, поскольку они представляют один и тот же период.Они начинаются в одну и ту же дату и время и заканчиваются в одну и ту же дату и время.Но я узнал, что они отличаются длиной в один ряд.Я хочу точно знать, какая строка или какая дата отсутствует между одним и другим.В качестве примера:

df1<- data.frame(DateTime=c("2016-08-01 06:00:00","2016-08-01 07:00:00","2016-08-01 09:00:00","2016-08-01 10:00:00","2016-08-01 11:00:00","2016-08-01 12:00:00","2016-08-01 13:00:00","2016-08-01 14:00:00","2016-08-01 15:00:00","2016-08-01 16:00:00"),
                 Var1=c(23,34,34,56,54,34,2,34,78,65))
df1$DateTime<- as.POSIXct(df1$DateTime, format ="%Y-%m-%d %H", tz = "UTC")
df2<- data.frame(DateTime=c("2016-08-01 06:00:00","2016-08-01 07:00:00","2016-08-01 08:00:00","2016-08-01 09:00:00","2016-08-01 10:00:00","2016-08-01 11:00:00","2016-08-01 12:00:00","2016-08-01 13:00:00","2016-08-01 14:00:00","2016-08-01 15:00:00","2016-08-01 16:00:00"),
                 Var2=c(34,56,75,43,45,67,8,67,89,09,23))
df2$DateTime<- as.POSIXct(df2$DateTime, format ="%Y-%m-%d %H", tz = "UTC")

df1
              DateTime Var1
1  2016-08-01 06:00:00   23
2  2016-08-01 07:00:00   34
3  2016-08-01 09:00:00   34
4  2016-08-01 10:00:00   56
5  2016-08-01 11:00:00   54
6  2016-08-01 12:00:00   34
7  2016-08-01 13:00:00    2
8  2016-08-01 14:00:00   34
9  2016-08-01 15:00:00   78
10 2016-08-01 16:00:00   65


df2
              DateTime Var2
1  2016-08-01 06:00:00   34
2  2016-08-01 07:00:00   56
3  2016-08-01 08:00:00   75
4  2016-08-01 09:00:00   43
5  2016-08-01 10:00:00   45
6  2016-08-01 11:00:00   67
7  2016-08-01 12:00:00    8
8  2016-08-01 13:00:00   67
9  2016-08-01 14:00:00   89
10 2016-08-01 15:00:00    9
11 2016-08-01 16:00:00   23

Я хотел бы узнать, какое время и дату они не делят, или какая строка является последней, где они используют одно и то же время между df1$DateTime и * 1007.* или в каком ряду df1 и df2 начинают различаться относительно DateTime.С любым из этих ответов было бы достаточно.

Я не нашел, как решить это с datetime.

В этом примере они не разделяют дату и время 2016-08-01 08:00:00.df1 и df2 совместно используют одно и то же время даты для одной и той же строки до строки 2, и они начинают различаться по дате и времени в строке 3.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Довольно просто определить несоответствие даты и времени, если вы используете all=TRUE:

merge(df1,df2, all=TRUE)
              DateTime Var1 Var2
1  2016-08-01 06:00:00   23   34
2  2016-08-01 07:00:00   34   56
3  2016-08-01 08:00:00   NA   75
4  2016-08-01 09:00:00   34   43
5  2016-08-01 10:00:00   56   45
6  2016-08-01 11:00:00   54   67
7  2016-08-01 12:00:00   34    8
8  2016-08-01 13:00:00    2   67
9  2016-08-01 14:00:00   34   89
10 2016-08-01 15:00:00   78    9
11 2016-08-01 16:00:00   65   23

Возможно также использовать отрицание %in% на двух векторах даты и времени.

df1$DateTime[ !df2$DateTime %in% df1$DateTime]
[1] "2016-08-01 09:00:00 UTC"

Преимущество первого метода заключается в том, что вам не нужно сначала выяснять, какой из них короче, а также обрабатывать случай, когда пересечение является «симметричным» в том смысле, что каждый вектор имеет пропущенное значение вдругой.Есть также некоторые функции «set»: setdiff, intersect и union, но они удаляют атрибуты, а даты и время заканчиваются числовыми значениями.

1 голос
/ 04 апреля 2019

Это довольно просто -

Matching-

> intersect(as.character(df2$DateTime),as.character(df1$DateTime))
 [1] "2016-08-01 06:00:00" "2016-08-01 07:00:00" "2016-08-01 09:00:00" "2016-08-01 10:00:00" "2016-08-01 11:00:00" "2016-08-01 12:00:00" "2016-08-01 13:00:00"
 [8] "2016-08-01 14:00:00" "2016-08-01 15:00:00" "2016-08-01 16:00:00"

Non-Matching-

> setdiff(as.character(df2$DateTime),as.character(df1$DateTime))
[1] "2016-08-01 08:00:00"

Примечание - Вы также можете использовать %like% из data.table для извлечения полных строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...