python - 有没有更高效、更优雅的方法来按日期过滤 pandas 索引?

标签 python pandas datetime indexing

我经常使用 DatetimeIndex.date,特别是在 groupby 方法中。但是,与 DatetimeIndex.year/month/day 相比,DatetimeIndex.date 速度较慢。据我了解,这是因为 .date 属性与索引上的 lambda 函数一起使用并返回日期时间有序索引,而 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

pandas/index 是否有我没有找到的类似功能?

最佳答案

您甚至可以稍微改进一下:

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

更新:按字符串分组:

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

关于python - 有没有更高效、更优雅的方法来按日期过滤 pandas 索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43103212/

相关文章:

python - 使用正则表达式从文本中提取特定字母并与字典进行比较

Python 在迭代文件行时无法更改变量的值

python pandas resample 应用 bin 开始和 bin 宽度

python - 如何使用 pandas 从当前行获取过去 12 个月的产品

python - 在工作簿的新工作表上创建 pandas 数据透视表

python - 启用 CORS 的 Flask restful api 不适用于远程 ajax 调用

python - 可以对数据框中的每一列应用百分位切割吗?

c# - String 未被识别为有效的 DateTime 格式异常

javascript - 在 php 中将 Javascript DateTime 格式化为日期 (‘ymdHis’ )

R:如何根据时间和日期查找计数