2017-03-29 22 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

相关问题