如何解决在python中通过30分钟获取最近的合并之前和之后的记录
我在csv文件中有两个数据帧。描述交通事故的第一数据(df1)和第二数据具有每15分钟(df2)的交通记录数据。我想根据最近的时间在它们之间合并。我使用了python pandas_merge_asof,并且得到了最接近的匹配项。但我希望从交通记录数据中获得比赛前后30分钟的记录。我想将最接近事件的事件与交通数据时间联系起来。如果事件发生在14:02:00,则该时间将与14:00:00记录的交通日期合并
例如:
1-事件数据
Date detector_id Inident_type
09/30/2015 8:00:00 1 crash
09/30/2015 8:02:00 1 congestion
04/22/2014 15:30:00 9 congestion
04/22/2014 15:33:00 9 Emergency vehicle
2-流量数据
Date detector_id traffic_volume
09/30/2015 7:30:00 1 55
09/30/2015 7:45:00 1 45
09/30/2015 8:00:00 1 60
09/30/2015 8:15:00 1 200
09/30/2015 8:30:00 1 70
04/22/2014 15:00:00 9 15
04/22/2014 15:15:00 9 7
04/22/2014 15:30:00 9 50
04/22/2014 15:45:00 9 11
04/22/2014 16:00:00 9 7
2-所需表格
Date detector_id traffic_volume Incident_type
09/30/2015 7:30:00 1 55 NA
09/30/2015 7:45:00 1 45 NA
09/30/2015 8:00:00 1 60 Crash
09/30/2015 8:00:00 1 60 congestion
09/30/2015 8:15:00 1 200 NA
09/30/2015 8:30:00 1 70 NA
04/22/2014 15:00:00 9 15 NA
04/22/2014 15:15:00 9 7 NA
04/22/2014 15:30:00 9 50 Congestion
04/22/2014 15:30:00 9 50 Emergency vehicle
04/22/2014 15:45:00 9 11 NA
04/22/2014 16:00:00 9 7 NA
我遵循的代码
Merge = pd.merge_asof(df2,df1,left_index = True,right_index = True,allow_exact_maches = False,on='Date',by='detector_id',direction='nearest')
但是它给了我这张桌子。
Date detector_id traffic_volume Incident_type
09/30/2015 8:00:00 1 60 Crash
04/22/2014 15:30:00 9 50 Congestion
我想知道事件发生前后的情况。
有什么想法吗? 谢谢。
*如果我这样问而犯错,请告诉我。
解决方法
对于任何有相同问题并想通过使用pandas.merge_asof进行合并的人,都必须使用Tolerance函数。此功能可帮助您调整两个数据集之间的时间差异。
但是您可能会遇到两个与Timedelta和排序索引有关的问题。因此,Timedelta的解决方案是将时间转换为日期时间,如下所示:
df1.Date = pd.to_datetime(df1.Date)
df2.Date = pd.to_datetime(df2.Date)
以及您需要在主代码中应用排序的排序索引,如下所示:
x = pd.merge_asof(df1.sort_values('Date'),#sort_values fix the error"left Key must be sorted"
df2.sort_values('Date'),on = 'Date',by = 'Detector_id',direction = 'backward',tolerance =pd.Timedelta('45 min'))
方向可能最接近,在我的情况下,它将选择45分钟内比赛记录前后的所有记录。
方向可能是向后的,将在完全匹配或最接近匹配之后的45分钟内合并所有记录 and Forward将在完全匹配或最接近匹配的45分钟内选择所有记录。
谢谢,希望这对以后的任何人都有帮助。