2016-06-08 31 views
2

Haben Sie einen Pandas Datenrahmen df, um Tag von der Datumsspalte zu bekommen, ich habe:Python Datumzeit Wochentag strftime() vs Wochentag()

df_raw['DayOfWeek'] = df_raw[str_date_colname].dt.strftime('%w') 

Es gibt Wochentag als Dezimalzahl, wobei 0 Sonntag und 6 ist Samstag. Ich möchte jedoch 0 ist Montag und 6 ist Sonntag. Also habe ich:

df_raw['DayOfWeek'] = df_raw[str_date_colname].dt.weekday() 

Aber es gibt: 'Series' object is not callable

Darf ich wissen, warum? Ich denke, beide strftime() und weekday() in Datetime-Objekte aufrufbar sind: https://docs.python.org/2/library/datetime.html

+0

Können Sie Wert und Typ von 'df_raw [str_date_colname] .dt' drucken? –

+0

@Shpionus ist es Kevin

Antwort

2

Wenn df ein Pandas Datenrahmen ist, dann df['date'] ist eine Serie. Wenn df['date'] Datumsangaben enthält (insbesondere wenn der D-Typ datetime64[ns] s ist), dann wird die Serie eine .dt accessor haben.

In [12]: type(df['date']) 
Out[12]: pandas.core.series.Series 

In [13]: type(df['date'].dt) 
Out[13]: pandas.tseries.common.DatetimeProperties 

Die DatetimeProperties Objekt zurückgegeben durch df['date'].dt hat eine weekdayproperty (keine Methode). Auf die Eigenschaften wird ohne Klammern zugegriffen. Verwenden Sie einfach df['date'].dt.weekday anstelle von df['date'].dt.weekday().


Zum Beispiel

import pandas as pd 
df = pd.DataFrame({'date': pd.date_range('2000-1-1', periods=7)}) 
df['dow'] = df['date'].dt.strftime('%w') 
df['dow2'] = df['date'].dt.weekday 
df['dow3'] = df['date'].dt.strftime('%a') 

ergibt

 date dow dow2 dow3 
0 2000-01-01 6  5 Sat 
1 2000-01-02 0  6 Sun 
2 2000-01-03 1  0 Mon 
3 2000-01-04 2  1 Tue 
4 2000-01-05 3  2 Wed 
5 2000-01-06 4  3 Thu 
6 2000-01-07 5  4 Fri 

Es ist allgemein behauptet, dass "Alles, was in Python ist ein Objekt". Daher ist es sehr wichtig, den Typ jedes Objekts zu verstehen, da dies bestimmt, welche Methoden und Attribute dieses Objekt haben wird. The documentation you linked to, zeigt die verfügbaren Methoden für datetime.datetime Objekte. Da df['date'].dt ein pandas.tseries.common.DatetimeProperties Objekt ist, hat es verschiedene Attribute.


Jedes Mal, wenn Sie eine Fehlermeldung des Formulars sehen

blahblah object is not callable 

Python Sie sagt es ein Objekt gefunden, obj vom Typ blahblah von Klammern - dh, es obj(...) angetroffen, wo type(obj) ist blahblah. Die Klammern bewirken, dass Python das Objekt aufruft. So ist es beschweren, dass obj nicht aufrufbar ist.

Um die Quelle des Problems in Zukunft zu finden, suchen Sie die Zeile in der vollständigen Traceback-Fehlermeldung und suchen Sie nach Klammern.

df_raw['DayOfWeek'] = df_raw[str_date_colname].dt.weekday() 

Das Objekt unmittelbar vor diesen Klammern sollte blahblah Typ sein. Zum Beispiel ist df_raw[str_date_colname].dt.weekday vom Typ Series. Sie werden dann die Ursache des Problems kennen. Sobald Sie wissen, dass es sich bei df_raw[str_date_colname].dt.weekday um eine Serie handelt, werden Sie neugierig sein, welche Werte es hat, und dann werden Sie feststellen, dass es bereits die Werte sind, nach denen Sie suchen.

+0

Vielen Dank für die detaillierte Erklärung! – Kevin