【发布时间】:2022-01-06 23:55:54
【问题描述】:
我有一些按时间排序的数据,用于跟踪不同事件的开始和结束时间。出于说明目的,假设我正在跟踪一组灯泡何时打开和关闭。我的数据结构如下:
| Bulb ID | Event (on/off) | Time (s) |
|---|---|---|
| 1 | on | 2 |
| 2 | on | 5 |
| 1 | off | 6 |
| 3 | on | 8 |
| 3 | off | 10 |
| 2 | off | 14 |
我想找出至少一个灯泡打开的总时间。到目前为止,我最好的想法是更改二进制标志中的 Event 列并对该列执行 cumsum,然后使用 numpy.diff 和 numpy.where 查找总和从 1 变为 0 或 0 变为 1 的行,然后将它们配对并将这两行之间的时间差加到总数中。所以是这样的:
df["event_flag"] = df["Event (on/off)"].map({"on": 1, "off": -1})
df["cumulative"] = df["event_flag"].cumsum()
df["cumulative"] = df.apply(lambda x: 1 if x >= 1 else 0)
switch_rows = df["Time (s)"][df["cumulative"].diff != 0].tolist()
total_time = 0
for i in range(0, len(switch_rows), 2):
total_time += switch_rows[i+1] - switch_rows[i]
这可行,但不是很安全,因为它假设数据开始和结束时所有灯泡都关闭,但情况不一定如此。有没有更简洁和/或更安全的方法来做到这一点,或者我应该坚持我所拥有的并添加对初始系统状态的检查?
【问题讨论】:
标签: python pandas dataframe time-series