使用 Pandas DataFrames 按天对设备的状态时间进行分箱

问题描述 投票:0回答:1

我有一个电源启用/禁用命令与时间的 Pandas 数据帧。该索引目前尚未使用。您可以使用以下命令自行创建:

pd.DataFrame(
    {'command_timestamp': {
        0: pd.Timestamp('2023-08-01 15:39:42'),
        1: pd.Timestamp('2023-08-02 03:30:39'),
        2: pd.Timestamp('2023-08-02 16:09:35'),
        4: pd.Timestamp('2023-08-02 17:30:16'),
        5: pd.Timestamp('2023-08-02 17:32:05'),
        6: pd.Timestamp('2023-08-02 17:45:43'),
        7: pd.Timestamp('2023-08-03 17:48:01'),
        8: pd.Timestamp('2023-08-03 18:20:11'),
        9: pd.Timestamp('2023-08-04 18:49:37'),
        10: pd.Timestamp('2023-08-07 21:13:05')},
     'command': {
        0: 'enable',
        1: 'disable',
        2: 'enable',
        4: 'enable',
        5: 'enable',
        6: 'disable',
        7: 'enable',
        8: 'disable',
        9: 'enable',
        10: 'disable'}})

我正在努力做什么

我需要按天计算设备的“开启时间”。想象一下实际的数据集比这个示例集大得多。我似乎无法想出好的解决方案,更不用说不涉及迭代数据帧并检查大量

if
语句的解决方案了。

需要考虑的一些事项:

  • 如果数据集的第一个命令是“启用”,我们可以预期设备在此之前一整天都处于关闭状态。
    • 类似地,如果第一个命令是“禁用”,我们可以假设它到那时为止全天都处于开启状态,如果数据集的最后一个命令是“启用”,我们可以假设设备在剩余时间内处于开启状态当日。
  • 如果一天开启,直到第二天(或多天后)才关闭,第一天的开启时间应该持续到午夜,接下来的日子的开启时间应该从午夜开始。换句话说,一天的开启时间不应超过 24 小时。
  • 可以忽略连续的启用或禁用命令(即,如果设备已经打开,则另一个“启用”不会执行任何操作,并且不会丢失命令)。
python pandas dataframe binning
1个回答
0
投票

只需使用

shift
即可求差并求和,如果
enable

>>> df['diff'] = df['command_timestamp'].shift(-1) - df['command_timestamp']
>>> df
     command_timestamp  command            diff
0  2023-08-01 15:39:42   enable 0 days 11:50:57
1  2023-08-02 03:30:39  disable 0 days 12:38:56
2  2023-08-02 16:09:35   enable 0 days 01:20:41
4  2023-08-02 17:30:16   enable 0 days 00:01:49
5  2023-08-02 17:32:05   enable 0 days 00:13:38
6  2023-08-02 17:45:43  disable 1 days 00:02:18
7  2023-08-03 17:48:01   enable 0 days 00:32:10
8  2023-08-03 18:20:11  disable 1 days 00:29:26
9  2023-08-04 18:49:37   enable 3 days 02:23:28
10 2023-08-07 21:13:05  disable             NaT

>>> df.loc[df['command'] == 'enable', 'diff'].sum()
Timedelta('3 days 16:22:43')

编辑。我同意乔的评论,即在每天开始时重新输入启用或禁用命令是没有意义的。后来的评论似乎确实与我的做法相同。

© www.soinside.com 2019 - 2024. All rights reserved.