2012-12-06 54 views
13

我想過濾掉週末數據,只查看週一至週五的數據(mon(0)-fri(4))。我是熊貓新手,在熊貓中完成這個最好的方法是什麼?在熊貓我如何groupby weekday()爲日期時間列?

import datetime 
from pandas import * 

data = read_csv("data.csv") 
data.my_dt 

Out[52]: 
0  2012-10-01 02:00:39 
1  2012-10-01 02:00:38 
2  2012-10-01 02:01:05 
3  2012-10-01 02:01:07 
4  2012-10-01 02:02:03 
5  2012-10-01 02:02:09 
6  2012-10-01 02:02:03 
7  2012-10-01 02:02:35 
8  2012-10-01 02:02:33 
9  2012-10-01 02:03:01 
10 2012-10-01 02:08:53 
11 2012-10-01 02:09:04 
12 2012-10-01 02:09:09 
13 2012-10-01 02:10:20 
14 2012-10-01 02:10:45 
... 

我想這樣做:

weekdays_only = data[data.my_dt.weekday() < 5] 

AttributeError的: 'numpy.int64' 對象有沒有屬性 '工作日'

但是,這並不工作,我的天堂不太清楚列日期時間對象是如何訪問的。

最終的目標是分層次安排平日小時的範圍內,這樣的:

monday, 0-6, 7-12, 13-18, 19-23 
tuesday, 0-6, 7-12, 13-18, 19-23 
+1

不確定你的用例,但通常你可以通過將'parse_dates = True'和'index_col = '作爲關鍵字參數傳遞給'read_csv'並且'read_csv'返回一個'pandasTimeSeries'來使用'my_dt'作爲索引'。那麼你可以簡單地做'weekdays = data [data.index.weekday <5]' – bmu

回答

23

你給函數「工作日」的呼叫,因爲它在data.my_dt的指標,工作不工作這是一個Int64陣列(這是錯誤消息來自)

可以創建在使用像含有平日數據的新柱:

data['weekday'] = data['my_dt'].apply(lambda x: x.weekday()) 

那麼你可以過濾與平日:

weekdays_only = data[data['weekday'] < 5 ] 

我希望這有助於

+1

太棒了!那會做...好的,我也注意到data.my_dt.map()可以用來做同樣的事情。你知道使用.map()和.apply()之間的區別嗎? – monkut

+2

在這種情況下,它們是等效的。應用程序也可以做聚合和其他事情 –

8

比較快的方式是使用DatetimeIndex.weekday,像這樣:

temp = pd.DatetimeIndex(data['my_dt']) 
data['weekday'] = temp.weekday 

非常非常快,尤其是對大型行數。欲瞭解更多信息,請檢查this的答案。

+1

如果你正在運行Pandas 0.15,你可以直接寫'data ['my_dt'] .t.weekday',提供'data ['my_dt']'是datetime或timedelta或類似的基於日期的格式(有關更多信息,請參閱http://pandas.pydata.org/pandas-docs/version/0.15.0/basics.html#basics-dt-accessors)。如果不是,'data ['my_dt'] = pd.to_datetime(data ['my_dt'])'將它轉換爲datetime(你也可以在'pd.to_datetime()'中指定格式和其他東西,參見http ://pandas.pydata.org/pandas-docs/stable/generated/pandas.tseries.tools.to_datetime.html)。 – Kartik