我有一个电源启用/禁用命令与时间的 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
语句的解决方案了。
需要考虑的一些事项:
只需使用
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')
编辑。我同意乔的评论,即在每天开始时重新输入启用或禁用命令是没有意义的。后来的评论似乎确实与我的做法相同。