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
对象有一个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
俗称"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.weekday
是 Series
类型。
然后你就会知道问题的根源。一旦您知道 df_raw[str_date_colname].dt.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
对象有一个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
俗称"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.weekday
是 Series
类型。
然后你就会知道问题的根源。一旦您知道 df_raw[str_date_colname].dt.weekday
是一个系列,您就会好奇地想看看它的值是什么,然后您会发现它已经是您要查找的值。