如果时间戳有秒数,你可以先移除它们,以便按整分钟分组。
df2 = (
df
.groupby(df['timestamp'].map(lambda x: x.replace(second=0)))['status']
.value_counts()
.unstack(fill_value=0)
.reset_index()
)
>>> df2
status timestamp FAILED PASSED UNKNOWN
0 2019-01-01 09:00:00 2 2 1
1 2019-01-01 09:01:00 1 1 0
您可能希望在该范围内填写每分钟的值。与上面相同的代码,但不要在最后重置索引。然后:
df2 = df2.reindex(pd.date_range(df2.index[0], df2.index[-1], freq='1min'), fill_value=0)
时间
时间会因数据集的大小(大 vs 小)、异构数据 vs 同质数据等而有所不同。鉴于数据集基本上是一个日志,人们预计会有很多时间戳高变异性的数据。为了创建更适合的测试数据,让我们将示例数据帧扩大100k倍,然后使时间戳唯一(每分钟一个)。
df_ = pd.concat([df] * 100000)
df_['timestamp'] = pd.date_range(df_.timestamp.iat[0], periods=len(df_), freq='1min')
以下是新的时间安排:
%timeit pd.crosstab(df_['timestamp'],df['status'])
%timeit df_.groupby(['timestamp','status']).size().unstack(fill_value=0)
%%timeit
(
df_
.groupby(['timestamp', 'status'])
.size()
.unstack(fill_value=0)
.reset_index()
)
%%timeit
(
df_
.groupby(df['timestamp'].map(lambda x: x.replace(second=0)))['status']
.value_counts()
.unstack(fill_value=0)
.reset_index()
)
pd.crosstab(df['timestamp'],df['status'])
- ansev