2017-03-29 76 views
1

我經常使用DatetimeIndex.date,特別是在groupby方法中。但是,與DatetimeIndex.year/month/day相比,DatetimeIndex.date較慢。據我所知,這是因爲.date屬性在索引上使用lambda函數並返回datetime有序索引,而index.year/month/day只返回整數索引。我已經執行好一點,並會加快一些我的代碼(至少對發現在GROUPBY值)的一個小例子功能,但我覺得必須有一個更好的辦法:是否有一種更有效和優雅的方式來過濾按時間排列的熊貓指數?

In [217]: index = pd.date_range('2011-01-01', periods=100000, freq='h') 

In [218]: data = np.random.rand(len(index)) 

In [219]: df = pd.DataFrame({'data':data},index) 

In [220]: def func(df): 
...:  groupby = df.groupby([df.index.year, df.index.month, df.index.day]).mean() 
...:  index = pd.date_range(df.index[0], periods = len(groupby), freq='D') 
...:  groupby.index = index 
...:  return groupby 
...: 

In [221]: df.groupby(df.index.date).mean().equals(func(df)) 
Out[221]: True 

In [222]: df.groupby(df.index.date).mean().index.equals(func(df).index) 
Out[222]: True 

In [223]: %timeit df.groupby(df.index.date).mean() 
1 loop, best of 3: 1.32 s per loop 

In [224]: %timeit func(df) 
10 loops, best of 3: 89.2 ms per loop 

熊貓/索引是否具有我找不到的類似功能?

回答

2

你甚至可以提高一點點:

In [69]: %timeit func(df) 
10 loops, best of 3: 84.3 ms per loop 

In [70]: %timeit df.groupby(pd.TimeGrouper('1D')).mean() 
100 loops, best of 3: 6 ms per loop 

In [84]: %timeit df.groupby(pd.Grouper(level=0, freq='1D')).mean() 
100 loops, best of 3: 6.48 ms per loop 

In [71]: (func(df) == df.groupby(pd.TimeGrouper('1D')).mean()).all() 
Out[71]: 
data True 
dtype: bool 

另一個解決方案 - 使用DataFrame.resample()方法:

In [73]: (df.resample('1D').mean() == func(df)).all() 
Out[73]: 
data True 
dtype: bool 

In [74]: %timeit df.resample('1D').mean() 
100 loops, best of 3: 6.63 ms per loop 

UPDATE:分組由字符串:

In [75]: %timeit df.groupby(df.index.strftime('%Y%m%d')).mean() 
1 loop, best of 3: 2.6 s per loop 

In [76]: %timeit df.groupby(df.index.date).mean() 
1 loop, best of 3: 1.07 s per loop 
+1

' df.groupby(df.index.strftime( '%Y%米%d'))。平均()'? – piRSquared

+1

@piRSquared,增加了相應的時間... – MaxU

+0

@MaxU完美!非常感謝! – VolkrB

相關問題