2017-01-30 2 views
0

Ich bin verwirrt darüber, wenn ich eine Funktion auf ein Array-Element anwenden kann, aber nicht auf das gesamte Array. Zum Beispiel:Warum funktioniert Funktion auf Element, aber nicht auf Array?

Ich habe einen Datenrahmen von Zeitstempeln, wo ich nur die einzigartigen Daten und den Tag von Wochen in einen Datenrahmen bekommen möchte. Ziehen die Daten aus ist recht einfach:

dates_only = df.dtime.dt.date.unique() 

an diesem Punkt:

print type(dates_only)   -> <type 'numpy.ndarray'> 
print type(dates_only[0])  -> <type 'datetime.date'> 
print dates_only[0].weekday() -> 4 

aber ich kann durch die Anwendung der Wochentag Funktion eine neue Serie nicht schaffen:

dow = dates_only.weekday() 

--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-10-76986b9b07a2> in <module>() 
----> 4 dow = dates_only.weekday() 

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

Do I muss das NDarray irgendwie werfen oder sollte ich diese in einer Schleife verarbeiten wie:

for i in range(len(dates_only)): 
    dow[i] = dates_only[i].weekday() 

Ich denke, es wird funktionieren, aber es scheint nur so falsch ...

Vielen Dank für die Suche!

+1

Im Allgemeinen sind Python-Funktionen * nicht * vektorisiert. Vektorisierung ist eine Eigenschaft von 'numpy' und numpy-verwandten Bibliotheken (z.B.' Pandas'). Jezrael wies darauf hin, dass dieses besondere Merkmal in "Pandas" vektorisiert implementiert wurde, aber wenn es nicht so wäre, müssten Sie eine Schleife machen. –

Antwort

1

Es gibt ein Problem unique Rückkehr numpy array, aber Sie können es zu DatetimeIndex konvertieren und dann DatetimeIndex.weekday verwenden, letzte Verwendung Series Konstruktor:

start = pd.to_datetime('2015-02-24') 
rng = pd.date_range(start, periods=10) 
df = pd.DataFrame({'dtime': rng, 'a': range(10)}) 
print (df) 
    a  dtime 
0 0 2015-02-24 
1 1 2015-02-25 
2 2 2015-02-26 
3 3 2015-02-27 
4 4 2015-02-28 
5 5 2015-03-01 
6 6 2015-03-02 
7 7 2015-03-03 
8 8 2015-03-04 
9 9 2015-03-05 
dates_only = pd.DatetimeIndex(df.dtime.dt.date.unique()) 

dow = dates_only.weekday 
print (dow) 
[1 2 3 4 5 6 0 1 2 3] 

dow = pd.Series(dates_only.weekday, index=df.index) 
print (dow) 
0 1 
1 2 
2 3 
3 4 
4 5 
5 6 
6 0 
7 1 
8 2 
9 3 
dtype: int32 

Eine andere Lösung konvertieren ist numpy arrayto_datetime und verwenden Sie dann Series Erbauer:

dates_only = pd.Series(pd.to_datetime(df.dtime.dt.date.unique()), index=df.index) 
print (dates_only) 

dow = dates_only.dt.weekday 
print (dow) 
0 1 
1 2 
2 3 
3 4 
4 5 
5 6 
6 0 
7 1 
8 2 
9 3 
dtype: int64 
+0

Hey danke! Das funktioniert großartig. Ich verstehe immer noch nicht, warum ich manchmal ganze Arrays oder Elemente mit einer einzigen Funktion verarbeiten kann, aber das behebt mein unmittelbares Problem mit Sicherheit. – kztd

0

Sie haben eine Reihe von Zeitobjekten.

Und die Zeit Objekte haben diese Methode week_day():

print dates_only[0].weekday() -> 4 

Aber das lässt sich nicht die Array-Zeit eine Zeit Objekt-Objekte in!

Mit anderen Worten: Wenn Sie eine Schachtel mit Äpfeln haben, bedeutet das, dass Sie die Schachtel selbst essen können?

Siehe here für mögliche Lösungen.

+0

Verstanden. Sie sagen, dass es keine Möglichkeit gibt, Objektfunktionen auf ein Array solcher Objekte anzuwenden. – kztd

+0

Genau. Und die anderen Antworten sagen dir, wie man die Daten sammelt, die du suchst ;-) – GhostCat

0

Sie können ein Array wie dieses nicht behandeln. Sie müssen über das Array wie Sie schreiben Schleife (sieht nicht falsch für mich) oder verwenden Sie Karte:

+0

y, das rockt! Das habe ich gesucht. – kztd

Verwandte Themen