2017-11-08 4 views
2

ich überprüfen müssen, ob in dem Array realtime es Zeit Proben, die nicht inkrementelle sind (Zeit rückwärts gehen)überprüfen, ob Elemente eines Arrays sind monotone

realtime 
Out[2]: 
array([datetime.datetime(2017, 11, 3, 20, 25, 10, 724000), 
     datetime.datetime(2017, 11, 3, 20, 25, 10, 744000), 
     datetime.datetime(2017, 11, 3, 20, 25, 10, 764000), ..., 
     datetime.datetime(2017, 11, 4, 2, 13, 44, 704000), 
     datetime.datetime(2017, 11, 4, 2, 13, 44, 724000), 
     datetime.datetime(2017, 11, 4, 2, 13, 44, 744000)], dtype=object) 

Realtime ist 1045702L!

Ich habe versucht, von

d = pd.DataFrame(np.zeros((len(realtime), 1))) 
for i in range(len(realtime)): 
    if any(realtime[i] <= x for x in realtime[:i]): # smaller/equal than any prior 
     d.iloc[i] = True  

zu tun, aber es dauert ewig ... gibt es einen schnelleren Weg, ob die Elemente in einem Array zu überprüfen sind inkrementell und wenn nicht Flagge sie?

+0

Sie meinen Sie 'monotonic', nicht inkrementelle? – quamrana

+0

Ich meine, dass Echtzeit [i] niemals kleiner ist als die Echtzeit vor – gabboshow

+1

Also, ich denke, das ist ein Ja. Vielleicht könnten Sie Ihre Frage so bearbeiten, dass andere, die nach Monoton suchen, diese Frage finden. – quamrana

Antwort

4

können Sie comapre array von numpy.diff mit 0 Timedelta erstellen:

b = np.diff(realtime) > datetime.timedelta(0) 
print (b) 

[ True True True True True] 

In Pandas Sie zu einem pd.Series Objekt umwandeln konnte und verwenden diff:

b = pd.Series(realtime).diff() 
#replace first NaN value to 1 
b.iat[0] = 1 

print (b > pd.Timedelta(0)) 
0 True 
1 True 
2 True 
3 True 
4 True 
5 True 
dtype: bool 

realtime automatisch np.datetime64 gegossen wird, aus welche diff produziert Timedelta Objekte.

Timings:

realtime = np.array([datetime.datetime(2017, 11, 3, 20, 25, 10, 724000), 
     datetime.datetime(2017, 11, 3, 20, 25, 10, 744000), 
     datetime.datetime(2017, 11, 3, 20, 25, 10, 764000), 
     datetime.datetime(2017, 11, 4, 2, 13, 44, 704000), 
     datetime.datetime(2017, 11, 4, 2, 13, 44, 724000), 
     datetime.datetime(2017, 11, 4, 2, 13, 44, 744000)], dtype=object) 


realtime = np.random.choice(realtime, size=1045702) 

In [256]: %timeit[x.total_seconds() > 0 for x in np.diff(realtime)] 
1 loop, best of 3: 382 ms per loop 

In [257]: %timeit np.diff(realtime) > datetime.timedelta(0) 
10 loops, best of 3: 88.2 ms per loop 

In [258]: %timeit (pd.Series(realtime).diff() > pd.Timedelta(0)) 
10 loops, best of 3: 147 ms per loop 

In [259]: %%timeit 
    ...: b = pd.Series(realtime).diff() 
    ...: b.iat[0] = 1 
    ...: 
    ...: b > pd.Timedelta(0) 
    ...: 
10 loops, best of 3: 149 ms per loop 
+0

Wenn Sie die Bearbeitung nicht mögen, können Sie einen Rollback durchführen. Ich habe meine Antwort gelöscht, weil sie schlechter ist. –

+0

Danke, kein Problem. – jezrael

+0

Plus eins für die letzte Lösung, das wird auf jeden Fall das schnellste sein. – miradulo

Verwandte Themen