基于R中的日期/时间范围联接数据

基于R中的日期/时间范围联接数据,r,R,我有一个文件(位置),有x,y坐标和日期/时间标识。我想从第二个表(天气)中获取信息,该表具有“相似”的日期/时间变量和辅助变量(温度和风速)。诀窍在于两个表中的日期/时间不完全相同。我想从位置数据中选择最接近的天气数据。我知道我需要做一些循环,就是这样 Example location example weather x y date/time date/tim

我有一个文件(位置),有x,y坐标和日期/时间标识。我想从第二个表(天气)中获取信息,该表具有“相似”的日期/时间变量和辅助变量(温度和风速)。诀窍在于两个表中的日期/时间不完全相同。我想从位置数据中选择最接近的天气数据。我知道我需要做一些循环,就是这样

Example location                                    example weather

x    y     date/time                         date/time           temp        wind
1    3     01/02/2003 18:00                  01/01/2003 13:00     12          15
2    3     01/02/2003 19:00                  01/02/2003 16:34     10          16
3    4     01/03/2003 23:00                  01/02/2003 20:55     14          22
2    5     01/04/2003 02:00                  01/02/2003 21:33     14          22
                                             01/03/2003 00:22     13          19
                                             01/03/2003 14:55     12          12
                                             01/03/2003 18:00     10          12
                                             01/03/2003 23:44     2           33
                                             01/04/2003 01:55     6           22
因此,最终输出将是一个表,其中包含与位置数据正确匹配的“最佳”天气数据

x    y     datetime               datetime           temp        wind
1    3     01/02/2003 18:00  ----  01/02/2003 16:34     10          16
2    3     01/02/2003 19:00  ----  01/02/2003 20:55     14          22
3    4     01/03/2003 23:00  ----  01/03/2003 00:22     13          19               
2    5     01/04/2003 02:00  ----  01/04/2003 01:55     6           22

从哪里开始有什么建议吗?我试着用一种快捷的方法来做这件事。 如果创建两个data.table的X和Y,都带有键,则语法为:

X[Y,roll=TRUE]
我们称之为滚动连接,因为我们将X中的主要观测值向前滚动,以匹配Y中的行。请参见?data.table中的示例和简介小插图

另一种方法是动物园套餐,其中包含locf(最后一次观察结转),可能还有其他套餐

我不确定你指的是最近的地点还是时间。若位置,那个位置是x,y坐标,那个么我想你们需要在2D空间中进行一些距离测量。data.table仅对单变量进行“最接近”,例如按时间。第二次阅读你的问题,似乎你的意思是最接近普遍意义上的


编辑:现在查看示例数据。data.table不会一步完成此操作,因为尽管它可以向前或向后滚动,但不会滚动到最近的位置。您可以使用which=TRUE执行一个额外步骤,然后测试盛行后的一个是否更接近。我需要将该数据作为数据和时间单独输入,然后粘贴并格式化

location$dt.time <- as.POSIXct(paste(location$date, location$time), 
                                 format="%m/%d/%Y %H:%M")

我的答案似乎与你的有点不同,但另一位读者已经质疑你用手正确匹配的能力。

我希望你不用传统的循环就能解决这个问题。apply族中的一条语句加上一个approx()就可以很好地解决这个问题。建议从哪里开始?给我们一些合适的数据来处理。与其粘贴文本,不如在R中构造数据,然后将dput()的结果粘贴到此处,这样我们就可以轻松地重建数据并编写一些可以测试的代码。为什么位置的第3行与天气的第5行合并?weather的第8行不是最接近2003年3月1日23:00吗?@Matthew-你是对的,在飞行中生成数据是一个错误谢谢,我会看看它是否做得更好,或者更快,因为到目前为止,这是我根据我在MySQL脚本中看到的一些内容所做的(I in 1:nrow(loc))){index=which.min(abs(loc$DateTime[i]-weather$DateTime))loc$WndSp[i]=weather$WndSp[index]}哈哈哈!人为错误!因此,需要计算机的动画处理。
 sapply(location$dt.time, function(x) which.min(abs(difftime(x, weather$dt.time))))
# [1] 2 3 8 9
 cbind(location, weather[ sapply(location$dt.time, 
                      function(x) which.min(abs(difftime(x, weather$dt.time)))), ])

  x y       date  time             dt.time       date  time temp wind             dt.time
2 1 3 01/02/2003 18:00 2003-01-02 18:00:00 01/02/2003 16:34   10   16 2003-01-02 16:34:00
3 2 3 01/02/2003 19:00 2003-01-02 19:00:00 01/02/2003 20:55   14   22 2003-01-02 20:55:00
8 3 4 01/03/2003 23:00 2003-01-03 23:00:00 01/03/2003 23:44    2   33 2003-01-03 23:44:00
9 2 5 01/04/2003 02:00 2003-01-04 02:00:00 01/04/2003 01:55    6   22 2003-01-04 01:55:00

 cbind(location, weather[ 
                  sapply(location$dt.time, 
                    function(x) which.min(abs(difftime(x, weather$dt.time)))), ])[ #pick columns
                          c(1,2,5,8,9,10)]

  x y             dt.time temp wind           dt.time.1
2 1 3 2003-01-02 18:00:00   10   16 2003-01-02 16:34:00
3 2 3 2003-01-02 19:00:00   14   22 2003-01-02 20:55:00
8 3 4 2003-01-03 23:00:00    2   33 2003-01-03 23:44:00
9 2 5 2003-01-04 02:00:00    6   22 2003-01-04 01:55:00