@@ -240,6 +240,59 @@ def from_split_network(cls, group_dataset, indexs, **kwargs):
240240 def infos (self , label = "" ):
241241 return f"{ len (self )} obs { unique (self .segment ).shape [0 ]} segments"
242242
243+ def correct_close_events (self , nb_days_max = 20 ):
244+
245+ _time = self .time
246+ segment = self .segment .copy ()
247+ segments_connexion = dict ()
248+
249+ previous_obs , next_obs = self .previous_obs , self .next_obs
250+
251+ # record for every segments, the slice, indice of next obs & indice of previous obs
252+ for i , seg , _ in self .iter_on (self .segment ):
253+ if i .start == i .stop :
254+ continue
255+
256+ i_p , i_n = previous_obs [i .start ], next_obs [i .stop - 1 ]
257+ segments_connexion [seg ] = [i , i_p , i_n ]
258+
259+ for seg in sorted (segments_connexion .keys ()):
260+ seg_slice , i_seg_p , i_seg_n = segments_connexion [seg ]
261+ n_seg = segment [i_seg_n ]
262+
263+ # if segment has splitting
264+ if i_seg_n != - 1 :
265+ seg2_slice , i2_seg_p , i2_seg_n = segments_connexion [n_seg ]
266+ p2_seg = segment [i2_seg_p ]
267+
268+ # if it merge on the first in a certain time
269+ if (p2_seg == seg ) and (_time [i_seg_n ] - _time [i2_seg_p ] < nb_days_max ):
270+
271+ segment [i_seg_n : seg2_slice .stop ] = seg
272+ previous_obs [i_seg_n ] = seg_slice .stop - 1
273+
274+ self .segment [:] = segment
275+ self .next_obs [:] = next_obs
276+ self .previous_obs [:] = previous_obs
277+
278+ self .sort ()
279+
280+ def sort (self , order = ("track" , "segment" , "time" )):
281+ """
282+ sort observations
283+
284+ :param tuple order: order or sorting. Passed to `np.argsort`
285+ """
286+
287+ index_order = self .obs .argsort (order = order )
288+ for field in self .elements :
289+ self [field ][:] = self [field ][index_order ]
290+
291+ translate = - ones (index_order .max () + 2 , dtype = "i4" )
292+ translate [index_order ] = arange (index_order .shape [0 ])
293+ self .next_obs [:] = translate [self .next_obs ]
294+ self .previous_obs [:] = translate [self .previous_obs ]
295+
243296 def obs_relative_order (self , i_obs ):
244297 self .only_one_network ()
245298 return self .segment_relative_order (self .segment [i_obs ])
0 commit comments