Python datetime weekday strftime() 对比 weekday()

Python datetime weekday strftime() vs weekday()

有一个 pandas 数据框 df,为了从日期列中获取工作日,我做了:

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

它 returns 十进制数形式的工作日,其中 0 是星期日,6 是星期六。但是,我想得到 0 是星期一,6 是星期日。所以我做了:

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

但是 returns: 'Series' object is not callable

请问为什么?我认为 strftime()weekday() 都可以在日期时间对象中调用:https://docs.python.org/2/library/datetime.html

如果 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

df['date'].dt返回的DatetimeProperties对象有一个weekdayproperty(不是方法)。访问属性时不带括号,因此只需使用 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

俗称"Everything in Python is an object"。因此,了解每个对象的 type 非常重要,因为这决定了该对象将具有哪些方法和属性。 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.weekdaySeries 类型。 然后你就会知道问题的根源。一旦您知道 df_raw[str_date_colname].dt.weekday 是一个系列,您就会好奇地想看看它的值是什么,然后您会发现它已经是您要查找的值。