【问题标题】:Python datetime weekday strftime() vs weekday()Python datetime weekday strftime() vs weekday()
【发布时间】:2016-10-09 04:30:33
【问题描述】:

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

【问题讨论】:

  • 你能打印出df_raw[str_date_colname].dt的值和类型吗?
  • @Shpionus 它是

标签: python datetime dataframe strftime weekday


【解决方案1】:

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

通常说“Python 中的一切都是对象”。因此,了解每个对象的 type 非常重要,因为这决定了该对象将具有哪些方法和属性。 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 是一个系列,您就会很好奇它的值是什么,然后您会发现它已经是您要查找的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多