【发布时间】:2017-06-15 05:52:47
【问题描述】:
我有以下数据框:
dt binary
2016-01-01 00:00:00 False
2016-01-01 00:00:01 False
2016-01-01 00:00:02 False
2016-01-01 00:00:03 False
2016-01-01 00:00:04 True
2016-01-01 00:00:05 True
2016-01-01 00:00:06 True
2016-01-01 00:00:07 False
2016-01-01 00:00:08 False
2016-01-01 00:00:09 True
2016-01-01 00:00:10 True
当binary 是True 时,我想总结经过的时间。我正在分享我的解决方案,它实现了它,但有些东西告诉我应该有一种更简单的方法,因为它是时间序列数据的一个非常基本的特性。请注意,数据很可能是等距的,但我不能依赖它。
df['binary_grp'] = (df.binary.diff(1) != False).astype(int).cumsum()
# Throw away False values
df = df[df.binary]
groupby = df.groupby('binary_grp')
df = pd.DataFrame({'timespan': groupby.dt.last() - groupby.dt.first()})
return df.timespan.sum().seconds / 60.0
最棘手的部分可能是第一行。它的作用是,它基本上为每个连续的块分配一个递增的数字。之后的数据如下所示:
dt binary binary_grp
2016-01-01 00:00:00 False 1
2016-01-01 00:00:01 False 1
2016-01-01 00:00:02 False 1
2016-01-01 00:00:03 False 1
2016-01-01 00:00:04 True 2
2016-01-01 00:00:05 True 2
2016-01-01 00:00:06 True 2
2016-01-01 00:00:07 False 3
2016-01-01 00:00:08 False 3
2016-01-01 00:00:09 True 4
2016-01-01 00:00:10 True 4
有没有更好的方法来做到这一点?我猜这段代码是高性能的,我担心的是可读性。
【问题讨论】:
标签: python pandas time-series