python - Pandas 测量自条件以来耗时

标签 python pandas time timedelta

我有以下数据框:

               Time   Work
2018-12-01 10:00:00     Off
2018-12-01 10:00:02     On
2018-12-01 10:00:05     On
2018-12-01 10:00:06     On
2018-12-01 10:00:07     On
2018-12-01 10:00:09    Off
2018-12-01 10:00:11    Off
2018-12-01 10:00:14     On
2018-12-01 10:00:16     On
2018-12-01 10:00:18     On
2018-12-01 10:00:20    Off

我想创建一个新列,其中包含设备开始工作以来耗时。

               Time   Work    Elapsed Time
2018-12-01 10:00:00    Off               0
2018-12-01 10:00:02     On               2
2018-12-01 10:00:05     On               5
2018-12-01 10:00:06     On               6
2018-12-01 10:00:07     On               7
2018-12-01 10:00:09    Off               0
2018-12-01 10:00:11    Off               0
2018-12-01 10:00:14     On               3
2018-12-01 10:00:16     On               5
2018-12-01 10:00:18     On               7
2018-12-01 10:00:20    Off               0

我该怎么做?

最佳答案

你可以使用groupby:

# df['Time'] = pd.to_datetime(df['Time'], errors='coerce') # Uncomment if needed.
sec = df['Time'].dt.second
df['Elapsed Time'] = (
    sec - sec.groupby(df.Work.eq('Off').cumsum()).transform('first'))

df
                  Time Work  Elapsed Time
0  2018-12-01 10:00:00  Off             0
1  2018-12-01 10:00:02   On             2
2  2018-12-01 10:00:05   On             5
3  2018-12-01 10:00:06   On             6
4  2018-12-01 10:00:07   On             7
5  2018-12-01 10:00:09  Off             0
6  2018-12-01 10:00:11  Off             0
7  2018-12-01 10:00:14   On             3
8  2018-12-01 10:00:16   On             5
9  2018-12-01 10:00:18   On             7
10 2018-12-01 10:00:20  Off             0

这个想法是提取秒部分并从状态从“关闭”变为“开启”的第一刻减去耗时。这是使用 transformfirst 完成的。

cumsum 用于标识组:

df.Work.eq('Off').cumsum()

0     1
1     1
2     1
3     1
4     1
5     2
6     3
7     3
8     3
9     3
10    4
Name: Work, dtype: int64

如果您的设备有可能在“开启”状态下持续数分钟,则将 sec 初始化为:

sec = df['Time'].values.astype(np.int64) // 10e8

df['Elapsed Time'] = (
    sec - sec.groupby(df.Work.eq('Off').cumsum()).transform('first'))

df
                  Time Work  Elapsed Time
0  2018-12-01 10:00:00  Off           0.0
1  2018-12-01 10:00:02   On           2.0
2  2018-12-01 10:00:05   On           5.0
3  2018-12-01 10:00:06   On           6.0
4  2018-12-01 10:00:07   On           7.0
5  2018-12-01 10:00:09  Off           0.0
6  2018-12-01 10:00:11  Off           0.0
7  2018-12-01 10:00:14   On           3.0
8  2018-12-01 10:00:16   On           5.0
9  2018-12-01 10:00:18   On           7.0
10 2018-12-01 10:00:20  Off           0.0

关于python - Pandas 测量自条件以来耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53656878/

相关文章:

c# - 不同编程语言的库如何处理日期和时间、时间戳和持续时间、闰秒和 - 年、DST 和时区,...?

python - AWS API Lambda 代理集成中返回错误响应

python:索引越界的数组默认值

python - 编译AggregatorV2V3Interface导致TypeError : Interfaces cannot inherit.接口(interface)

python - 创建库存历史记录的最有效方法是什么

python - pandas df.to_sql到Oracle数据库数据类型不一致

python - 按空格拆分,某些字符之间除外

python - Pandas 与多个值变量一起融化

c++ - 基于单元框架的算法性能测试的可靠性

php - 获取最后一个星期四,但前提是它是此序列中的第二个星期四