2016-06-08 2 views
2

Есть панды dataframe Д.Ф., чтобы получить день недели из столбца даты, я сделал:Python даты и время дня недели STRFTIME() против буднего дня()

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

+0

Не могли бы вы напечатать значение и тип 'df_raw [str_date_colname] .dt'? –

+0

@Shpionus это <класс 'pandas.tseries.common.DatetimeProperties'> – Kevin

ответ

2

Если df является Панда 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 имеет 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 

Это обычно говорит, что "все в Python является объектом". Поэтому очень важно понять тип типа каждого объекта, поскольку он определяет, какие методы и атрибуты будет иметь этот объект. 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 - это серия, вам будет интересно узнать, каковы ее значения, и тогда вы обнаружите, что это уже ценности, которые вы ищете.

+0

Спасибо за подробное объяснение !! – Kevin

Смежные вопросы