python - 在 Pandas 中查找时间序列数据中某个值出现的最后一个序列

标签 python pandas time-series

我有 10 天的每分钟时间序列数据,包含三列:time stamp , category , alarm .给定一个日期,我想 groupby类别并找到 timestamps在给定日期之前连续将闹钟设置为 1 并为其创建 dataframe从这个子集。

   'Category'       'Date'              'Alarm'
0      A        1999-11-10 12:01:00        1
1      A        1999-11-10 12:02:00        1
2      A        1999-11-10 12:03:00        1
3      A        1999-11-10 12:04:00        1
4      A        1999-11-10 12:05:00        0
5      A        1999-11-10 12:06:00        0
.
.
.
1101   A        1999-11-13 10:07:00        1
1102   A        1999-11-13 10:08:00        1
1103   A        1999-11-13 10:09:00        1
1104   B        1999-11-23 13:09:00        0
1105   B        1999-11-23 13:10:00        0
1106   B        1999-11-23 13:11:00        1
1107   B        1999-11-23 13:12:00        1
1108   B        1999-11-23 13:13:00        1
1109   B        1999-11-23 13:14:00        0
.
.
.
. 
2110   B        1999-11-26 13:13:00        0
2110   B        1999-11-26 13:14:00        0
2110   B        1999-11-26 13:15:00        1 
2111   B        1999-11-26 13:16:00        1 
2112   B        1999-11-26 13:17:00        1 
2113   B        1999-11-26 13:18:00        1 
2114   B        1999-11-26 13:19:00        1
2115   B        1999-11-26 13:20:00        0
2116   B        1999-11-26 13:21:00        0
2117   C        1999-12-02 17:11:00        1 
.
.    
.

我希望输出是一个只有这些行的新数据框:
     'Category'       'Date'              'Alarm'
 1101   A        1999-11-13 10:07:00        1
 1102   A        1999-11-13 10:08:00        1
 1103   A        1999-11-13 10:09:00        1
 2110   B        1999-11-23 13:15:00        1 
 2111   B        1999-11-23 13:16:00        1 
 2112   B        1999-11-23 13:17:00        1 
 2113   B        1999-11-23 13:18:00        1 
 2114   B        1999-11-23 13:19:00        1

即每组中最后一个连续序列为1的报警行。
我尝试过的:
df.groupby('category')['alarm'].apply(lambda x: x==1)

但这给出了所有警报为 1 的行,而不仅仅是连续 1 的最后一个序列。有关如何获得此值的任何说明表示赞赏。谢谢! :)

编辑 1:我只是提供了数据帧的一个子集。最后一个连续的 1 序列可以在任意天数之前出现(例如,如果时间序列是从 11 月 1 日到 11 月 10 日,对于一个类别,最后一个连续的 1 可能已经发生在 11 月 2 日或 11 月 8 日。而且 1 的长度也可能有所不同。

最佳答案

咱们试试吧

# convert to datetime type
df.Date = pd.to_datetime(df.Date)

# blocks of consecutive `1`:
s = (1-df.Alarm).cumsum()*df.Alarm

# last group of `1` within Category and day:
last_groups = s.groupby(df.Category).transform('max')

# output:
df[s==last_groups]

输出:
     Category                Date  Alarm
1101        A 1999-11-13 10:07:00      1
1102        A 1999-11-13 10:08:00      1
1103        A 1999-11-13 10:09:00      1
2110        B 1999-11-26 13:15:00      1
2111        B 1999-11-26 13:16:00      1
2112        B 1999-11-26 13:17:00      1
2113        B 1999-11-26 13:18:00      1
2114        B 1999-11-26 13:19:00      1
2117        C 1999-12-02 17:11:00      1

关于python - 在 Pandas 中查找时间序列数据中某个值出现的最后一个序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62104373/

相关文章:

python-2.7 - Python pandas groupby 对象 apply 方法添加索引

r - 将模型拟合到高频时间序列并使用寓言进行短期预测

python - pandas 数据框中带有附加问题的时间序列

python - 在python dict中访问多个值

python - 循环更改甚至没有循环的行数据?

python - 是否可以从 Python 中使用 re2?

r - R 中的数据帧 "expand"程序?

python - openpyxl 页面设置 "Fit To"与 "Adjust To"

python - 将数据框列中的字符串替换为字符串中的数字

python - 自定义 Sklearn Transformer 单独工作,在管道中使用时抛出错误