让我们看一些一分钟的数据:
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_by
或 reindex
或任何此类其他方法?
最佳答案
您可以使用自定义 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/