python - 有效地获取数据帧中可变长度的时间片

标签 python pandas

我想使用 DatetimeIndex 有效地对 DataFrame 进行切片(类似于重新采样或 groupby 操作),但所需的时间切片长度不同。

这通过循环相对容易实现(参见下面的代码),但是对于大时间序列,多个切片很快就会变慢。关于矢量化/提高速度有什么建议吗?

import pandas as pd, datetime as dt, numpy as np

#Example DataFrame with a DatetimeIndex
idx = pd.DatetimeIndex(start=dt.datetime(2017,1,1), end=dt.datetime(2017,1,31), freq='h')
df = pd.Series(index = idx, data = np.random.rand(len(idx)))

#The slicer dataframe contains a series of start and end windows
slicer_df = pd.DataFrame(index = [1,2])
slicer_df['start_window'] = [dt.datetime(2017,1,2,2), dt.datetime(2017,1,6,12)]
slicer_df['end_window'] = [dt.datetime(2017,1,6,12), dt.datetime(2017,1,15,2)]

#The results should be stored to a dataframe, indexed by the index of the slicer dataframe
#This is the loop that I would like to vectorise
slice_results = pd.DataFrame()
slice_results['total'] = None
for index, row in slicer_df.iterrows():
    slice_results.loc[index,'total'] = df[(df.index >= row.start_window) &
                                          (df.index <= row.end_window)].sum()

注意。我刚刚意识到我的特定数据集具有相邻的窗口(即一个窗口的开头对应于它之前的窗口的结尾),但窗口的长度不同。感觉应该有一种方法来执行 groupby 或类似的操作,只需一次传递 df...

最佳答案

您可以将其作为应用来执行,这将连接结果而不是迭代更新 DataFrame:

In [11]: slicer_df.apply((lambda row: \
              df[(df.index >= row.start_window) 
               & (df.index <= row.end_window)].sum()), axis=1)
Out[11]:
1     36.381155
2    111.521803
dtype: float64

关于python - 有效地获取数据帧中可变长度的时间片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46902567/

相关文章:

python - 对数组的每个元素求和

Python 使用相同的键汇总 Dataframe 中的行

python - 删除系列/数据帧多索引中的列

python - 多级 Pandas 数据框中的自定义排序列

python - Pandas 为什么/如何将方括号与 .loc 和 .iloc 一起使用?

python - 如何在 pandas .groupby 之后访问列

python - 使用 SoupStrainer 进行选择性解析

python - 比 Python 慢?

python - 如何在 MultiIndexed Datarfame 中对一个索引大于 X 的所有值求和,并根据其他索引进行分组?

python - python中的递归未达到正确的结果