有一个pandas数据帧df,为了从日期列中获取工作日,我做了:
df_raw['DayOfWeek'] = df_raw[str_date_colname].dt.strftime('%w')
它将工作日作为十进制数返回,其中0表示星期日,6表示星期六。但是,我希望0是星期一,6是星期日。所以我做了:
df_raw['DayOfWeek'] = df_raw[str_date_colname].dt.weekday()
但它返回:'Series' object is not callable
我可以知道为什么吗?我认为strftime()
和weekday()
都可以在日期时间对象中调用:https://docs.python.org/2/library/datetime.html
答案 0 :(得分:2)
如果df
是Pandas DataFrame,那么df['date']
就是一个系列。如果df['date']
包含日期时间(特别是,如果dtype为datetime64[ns]
s),则系列将包含.dt
accessor。
In [12]: type(df['date'])
Out[12]: pandas.core.series.Series
In [13]: type(df['date'].dt)
Out[13]: pandas.tseries.common.DatetimeProperties
DatetimeProperties
返回的df['date'].dt
对象有weekday
property(不是方法)。访问属性时不带括号,因此只需使用df['date'].dt.weekday
而不是df['date'].dt.weekday()
。
例如,
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')
产量
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
它通常说" Python中的一切都是一个对象"。因此,理解每个对象的类型非常重要,因为它决定了对象将具有哪些方法和属性。 The documentation you linked to,显示datetime.datetime
个对象可用的方法。由于df['date'].dt
是pandas.tseries.common.DatetimeProperties
对象,因此它具有不同的属性。
每当您看到表单
的错误消息时blahblah object is not callable
Python告诉你它找到了obj
类型的对象blahblah
,后跟
括号 - 即它obj(...)
遇到type(obj)
blahblah
。括号使Python调用该对象。因此,它是
抱怨obj
无法调用。
因此,为了找到未来问题的根源,找到提到的那一行 在完整的回溯错误消息中,并查找括号。
df_raw['DayOfWeek'] = df_raw[str_date_colname].dt.weekday()
紧靠这些括号前面的对象应该是blahblah
类型。
例如,df_raw[str_date_colname].dt.weekday
的类型为Series
。
然后,您将了解问题的根源。一旦你知道df_raw[str_date_colname].dt.weekday
是一个系列,你就会好奇地看到它的价值是什么,然后你会发现它已经是你正在寻找的价值。