如何找到两个大型数据框之间不常见的日期时间

时间:2019-04-04 17:48:41

标签: r

我有两个大的数据帧df1df2,由于它们表示相同的周期,因此理论上应该具有相同数量的行。它们在相同的日期和时间开始,并在相同的日期和时间结束。但是我发现它们的单行长度不同。我想确切知道彼此之间缺少哪一行或哪个日期。例如:

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$DateTimedf2$DateTime之间共享相同日期时间的最后一行,或者是哪一行df1df2DateTime方面开始有所不同。有了这些答案,就足够了。

我没有找到如何用日期时间解决这个问题。

在此示例中,他们不共享日期时间2016-08-01 08:00:00df1df2在同一行直到第2行共享相同的日期时间,而它们在第3行中的日期时间开始有所不同。

2 个答案:

答案 0 :(得分:2)

如果使用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"

第一种方法的优点是,您不必先弄清楚哪个较短,而且无需处理非交集为“对称”的情况,因为每个交点在向量中都有一个缺失值。其他。还有一些“设置”功能:setdiffintersectunion,但是它们确实删除了属性,并且日期时间最终以数字形式出现。

答案 1 :(得分:1)

非常简单-

匹配-

> 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"

不匹配

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

注意-您还可以使用%like%中的data.table提取完整的行。