python - 在 pandas 中使用下采样的另一种方法

标签 python python-2.7 python-3.x pandas

让我们看一些一分钟的数据:

In [513]: rng = pd.date_range('1/1/2000', periods=12, freq='T')
In [514]: ts = Series(np.arange(12), index=rng)
In [515]: ts
Out[515]:
2000-01-01 00:00:00      0
2000-01-01 00:01:00      1
2000-01-01 00:02:00      2
2000-01-01 00:03:00      3
2000-01-01 00:04:00      4
2000-01-01 00:05:00      5
2000-01-01 00:06:00      6
2000-01-01 00:07:00      7
2000-01-01 00:08:00      8
2000-01-01 00:09:00      9
2000-01-01 00:10:00      10
2000-01-01 00:11:00      11
Freq: T

假设您想通过采取以下方式将这些数据聚合成五分钟的 block 或条 每组总和:

In [516]: ts.resample('5min', how='sum')
Out[516]:
2000-01-01 00:00:00 0
2000-01-01 00:05:00 15
2000-01-01 00:10:00 40
2000-01-01 00:15:00 11
Freq: 5T

但是我不想使用 resample 方法并且仍然想要相同的输入输出。如何使用 group_byreindex 或任何此类其他方法?

最佳答案

您可以使用自定义 pd.Grouper这样:

 In [78]: ts.groupby(pd.Grouper(freq='5min', closed='right')).sum()
Out [78]:
1999-12-31 23:55:00     0
2000-01-01 00:00:00    15
2000-01-01 00:05:00    40
2000-01-01 00:10:00    11
Freq: 5T, dtype: int64

closed='right' 确保输出完全相同。


但是,如果您的目标是进行更多自定义分组,您可以将 .groupby 与您自己的向量一起使用:

 In [78]: buckets = (ts.index - ts.index[0]) / pd.Timedelta('5min')
 In [79]: grp = ts.groupby(np.ceil(buckets.values))

 In [80]: grp.sum()
Out[80]:
0     0
1    15
2    40
3    11
dtype: int64

输出不完全相同,但方法更灵活(例如可以创建不均匀的桶)。

关于python - 在 pandas 中使用下采样的另一种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36114619/

相关文章:

python - 为什么进度条总是卡在99%?

python - 生成器函数和异步生成器函数的用途有什么区别

python - 为什么 auc 与 sklearn 和 R 的逻辑回归如此不同

python-2.7 - 如何使用python将.docx文件转换为html?

python - 定义类变量时出现NameError

python - 字节数组和列表的区别

python - 获取 Pandas 数据框中的最大连续空行

python-3.x - 如果不为空,Pandas 使用值,否则使用下一列中的值

python - 使用 Django 获取对象的孙子

python - 在 python 中使用文本文件