Kev*_*vin 2 python datetime strftime weekday dataframe
有一个 pandas 数据框 df,为了从日期列中获取工作日,我做了:
df_raw['DayOfWeek'] = df_raw[str_date_colname].dt.strftime('%w')
Run Code Online (Sandbox Code Playgroud)
它以十进制数形式返回工作日,其中 0 表示星期日,6 表示星期六。但是,我想得到 0 是星期一,6 是星期日。所以我做了:
df_raw['DayOfWeek'] = df_raw[str_date_colname].dt.weekday()
Run Code Online (Sandbox Code Playgroud)
但它返回:'Series' object is not callable
我可以知道为什么吗?我认为 和strftime()都weekday()可以在日期时间对象中调用:https ://docs.python.org/2/library/datetime.html
如果df是 Pandas DataFrame,那么df['date']就是 Series。如果df['date']包含日期时间(特别是,如果数据类型为datetime64[ns]s),则 Series 将有一个.dt访问器。
In [12]: type(df['date'])
Out[12]: pandas.core.series.Series
In [13]: type(df['date'].dt)
Out[13]: pandas.tseries.common.DatetimeProperties
Run Code Online (Sandbox Code Playgroud)
DatetimeProperties返回的对象有df['date'].dt一个weekday 属性(而不是方法)。访问属性时不需要括号,因此只需使用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')
Run Code Online (Sandbox Code Playgroud)
产量
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
Run Code Online (Sandbox Code Playgroud)
人们常说“Python 中的一切都是对象”。因此,了解每个对象的类型非常重要,因为这决定了该对象将具有哪些方法和属性。您链接到的文档显示了可用于对象的方法datetime.datetime。既然df['date'].dt是一个pandas.tseries.common.DatetimeProperties对象,它就有不同的属性。
每当您看到表单的错误消息时
blahblah object is not callable
Run Code Online (Sandbox Code Playgroud)
Python 告诉您它找到了一个对象 ,obj类型为blahblah后跟括号 - 即它在
obj(...)哪里遇到了。括号导致 Python 调用该对象。因此,它是不可调用的抱怨。type(obj)blahblahobj
因此,为了将来查找问题的根源,请找到完整回溯错误消息中提到的行并查找括号。
df_raw['DayOfWeek'] = df_raw[str_date_colname].dt.weekday()
Run Code Online (Sandbox Code Playgroud)
紧邻这些括号前面的对象应该是类型blahblah。例如,df_raw[str_date_colname].dt.weekday是 类型Series。然后你就会知道问题的根源。一旦你知道这df_raw[str_date_colname].dt.weekday是一个系列,你就会好奇它的值是什么,然后你会发现它已经是你正在寻找的值。