2016-03-21 14 views
1

Gibt es eine Möglichkeit, die Vektorisierungsfunktionen von numpy zu verwenden, wenn Sie eine boolesche Operation für ein Array von datetime-Objekten ausführen, in denen Sie Attribute von datetime-Objekten vergleichen möchten.Wie vektorisiere ich eine boolesche Operation für eine Reihe von nackten Datumsangaben, wobei die boolesche Operation datetime-Objektattribute vergleicht?

Mein naiver erster Versuch war:

import datetime as dtm 
import numpy as np 
dt = np.array([dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2014,1,6,12,2,1), dtm.datetime(2014,1,5,12,2,1), dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2013,1,4,13,3,1), dtm.datetime(2013,1,5,22,2,1)]) 

bool = (dt.year == 2014) 

Das hat mir den Fehler gab:

AttributeError: 'numpy.ndarray' object has no attribute 'year' 

, die im Nachhinein offensichtlich war.

Ich glaube nicht, dass mein zweiter naiver Versuch war vektorisierbare, dachte aber, es die Arbeit erledigt bekommen würde:

bool = np.array([dts.year == 2014 for dts in dt]) 

Allerdings bekomme ich den Fehler:

SyntaxError: invalid syntax 

I don‘ Ich verstehe nicht, was ich in dieser Aussage falsch mache.

Ich würde eine vektorisierbare Lösung bevorzugen, und ich kann dies mit einer for-Schleife tun, aber ich denke, ich sollte zumindest in der Lage sein, dies in einer Zeile zu tun, ähnlich wie bei meinem zweiten Versuch.

Ist es möglich, diese Aussage zu vektorisieren? Wenn nicht, was mache ich bei meinem zweiten Versuch falsch? Vielen Dank.

+0

Die ungültige Syntax wahrscheinlich ist, weil Sie Klammern benötigen, so dass Sie ein boolean haben Objekt, von dem die Liste machen – Ilja

+0

Es muss etwas anderes falsch sein, ich habe gerade versucht es, und ich bin mit dem gleichen Fehler. – Shawn

+0

@Ilja OK, als ich Ihren Kommentar getestet habe, als ich ihn das erste Mal mit dt14 = [(dts == 2014) für dts in dt] getestet habe, wo ich versucht habe zu erreichen. Ich vernachlässige die zweiten [], also funktioniert dt14 = [[(dts == 2014) für dts in dt]]. Vielen Dank! – Shawn

Antwort

0

Oder Sie könnten, wie Sie gesagt haben, vectorize.

import datetime as dtm 
import numpy as np 
dt = np.array([dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2014,1,6,12,2,1), dtm.datetime(2014,1,5,12,2,1), dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2013,1,4,13,3,1), dtm.datetime(2013,1,5,22,2,1)]) 

is_2014 = np.vectorize(lambda d: d.year == 2014) 

bool_ = is_2014(dt) 
1

können Sie pandas verwenden:

>>> import pandas as pd 
>>> ser = pd.Series([dtm.datetime(2014,1,4,12,2,1), 
        dtm.datetime(2014,1,4,12,2,1), 
        dtm.datetime(2014,1,6,12,2,1), 
        dtm.datetime(2014,1,5,12,2,1), 
        dtm.datetime(2014,1,4,12,2,1), 
        dtm.datetime(2013,1,4,13,3,1), 
        dtm.datetime(2013,1,5,22,2,1)]) 

>>> ser[ser.dt.year==2014] 
0 2014-01-04 12:02:01 
1 2014-01-04 12:02:01 
2 2014-01-06 12:02:01 
3 2014-01-05 12:02:01 
4 2014-01-04 12:02:01 
dtype: datetime64[ns] 

Oder die bools als NumPy Array:

>>> (ser.dt.year==2014).values 
array([ True, True, True, True, True, False, False], dtype=bool) 
+0

Ich habe gerade gemerkt, dass ich es versäumt habe zu fragen, ob Pandas seine Operationen vektorisiert. Ich habe in der Vergangenheit schon ein bisschen mit ihm herumgespielt, aber ich bin immer noch neu bei Python und habe beschlossen zu warten, bis ich mit den Werkzeugen, die ich bereits hatte, vertrauter war. Aber wenn Pandas Operationen vektorisieren, sollte ich vielleicht ein wenig mehr darüber lernen, jetzt da ich mich mit einigen anderen Werkzeugen wohler fühle. – Shawn

1

numpy's own datetime64 dtype Versuchen. Sie müssen vielleicht etwas rechnen, um die Jahre zu beenden. Alternativ könnten Sie ein Array mit Unix-Timestamp-Ganzzahlen verwenden.

+0

Ich gehe davon aus, dass numpy in der Lage sein muss, datetime64 effizienter zu nutzen, oder es wäre nicht entwickelt worden. Ich arbeite mit viel Code mit dem Datetime-Modul, also frage ich mich, welche Vorteile es bietet, auf datetime64 umzusteigen. Ist es deutlich effizienter? Gibt es andere Vorteile? Ich habe datetime64 bereits erwähnt, habe aber nie seine Vorteile untersucht. – Shawn

+0

Es hängt wahrscheinlich ein bisschen von dem Problem in der Hand ab (vergleiche z.B. http: // stackoverflow.com/questions/29186939/langsam-performance-of-pandas-timestamp-vs-datetime und http://codereview.stackexchange.com/questions/77582/speeding-up-python-date-conversion-function-current-lyusing-using- Listen-Verständnis-a), aber ich denke, für Ihr Problem sollte es schneller sein (wenn das Array groß genug ist). Nachteile sind, dass die Schnittstelle nicht so schön ist wie die von datetime (es gibt keine '.year' etc. Methoden). – egpbos