2014-01-16 76 views
2

As in this question我已經問過了,我正在嘗試這個時間來做同樣的計數,但每天都有。所以我想這段時間到做一個星期一的較低值設定的次數,星期二的幾次等等,並計算一週中第7天的總計數爲天值列表如下:用熊貓每日頻率計數

2013.01.01,00:00,1.31802

2013.01.02,00:00,1.32038

2013.01.03,00:00,1.31859

2013.01.04,00:00,1.30508

目前我使用的是熊貓這個,那我用來做一個小時數是一段代碼:

df = pd.read_csv(myPath, sep=',', header=None, parse_dates=[[0, 1]]) 
df.columns = ["date","value"] 
df.set_index("date", inplace=True) 
day_min = df.resample('D', how='min') 
df['is_day_min'] = day_min.lookup(df.index.normalize(), len(df) * ['value'])==df.value 
df.is_day_min.resample('H', np.sum).fillna(0).astype(int)  
df.groupby(df.index.time)["is_day_max"].sum().to_csv("C:\\2013frequency_min.csv") 

但是,當涉及到分析日常DATAS如果我改變重採樣在day_min(第4行)爲「W」,在第6行爲「D」,則會出現以下錯誤:KeyError:Timestamp('2013-01-01 00:00:00',tz = None)

Can有人幫忙嗎?我相信這很簡單,但熊貓文檔不幫助我。 即使任何人有一個不使用熊貓的解決方案顯示給我。如果它有效,那就沒關係。 感謝

回答

5

您可以使用TimeGrouper,按周(看看值是否等於一週的分鐘),然後通過天重新取樣:

In [11]: week = df.groupby(pd.TimeGrouper('W')) 

In [12]: is_week_min = week['value'].apply(lambda x: x == x.min()).astype(int) # possibly the astype is not needed in 0.13 

In [13]: is_week_min.resample('D', how='sum') # count occurences in the day which are week min 
Out[13]: 
2013-01-01 0 
2013-01-02 0 
2013-01-03 0 
2013-01-04 1 
Freq: D, dtype: int64 

如果你想這個欄目,因爲每個星期幾,你可以內申請做GROUPBY:

In [14]: week['value'].apply(lambda x: ((x == x.min()).astype(int).groupby(x.index.dayofweek)).sum()).unstack(1) 
Out[14]: 
      1 2 3 4 
2013-01-06 0 0 0 1 

注:該指標是週末。

,並與您提供的引擎收錄鏈接:

In [21]: df = pd.read_csv('http://pastebin.com/raw.php?i=SuyWZLj5', header=None, parse_dates=[[0, 1]]) 
     df.columns = ['date', 'value'] 
     df.set_index('date', inplace=True) 

In [22]: df.groupby(pd.TimeGrouper('W')).value.apply(lambda x: ((x == x.min()).astype(int).groupby(x.index.dayofweek)).sum()).unstack(1) 
Out[22]: 
      0 1 2 3 4 
2013-01-06 NaN 0 0 0 1 
2013-01-13 0 0 0 1 0 
2013-01-20 0 0 0 1 0 
2013-01-27 1 0 0 0 0 
2013-02-03 0 1 0 0 0 
2013-02-10 0 0 0 0 1 
2013-02-17 0 0 0 0 1 
2013-02-24 0 0 0 0 1 
2013-03-03 0 0 1 0 NaN 
+0

是。有用。但是如果我只需要在1到7的索引上顯示計數(代表一週中的某幾天(在一週內將所有數據幀的結果分組),那該怎麼辦? – pietrovismara

+0

@ user3142367也許df.groupby(pd.TimeGrouper('W')).value.apply(lambda x:((x == x.min())。astype(int).groupby(x.index.day) ).sum())。unstack(1) –

+0

你給我的問題留出時間非常好。但是這樣你建議它給了我當月的一天的數字。我需要的是「我們有星期一的最低價值的4倍,所以我們加上4星期一(或第1天)」,以此類推星期二,星期三等等。 – pietrovismara