Python datetime weekday strftime()vs weekday()

时间:2016-06-08 18:40:11

标签: python datetime dataframe strftime weekday

有一个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

1 个答案:

答案 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'].dtpandas.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是一个系列,你就会好奇地看到它的价值是什么,然后你会发现它已经是你正在寻找的价值。