0

我正在尝试以秒为单位计算汽车不可用的时间段。我有下表:

╔═════════════════════╦═══════════╦══════╦═════════════╗
║ statusDateTime      ║ shift     ║ car  ║ isAvaliable ║
║ 2019-04-02 02:58:39 ║ 190402001 ║ E077 ║ 1           ║
║ 2019-04-02 13:17:58 ║ 190402002 ║ E077 ║ 0           ║
║ 2019-04-02 13:35:10 ║ 190402002 ║ E077 ║ 1           ║
╚═════════════════════╩═══════════╩══════╩═════════════╝

为了解决这个问题,我想将最后一个二进制列(isAvaliable)分为isAvaliable_0isAvaliable_1,我将从statusDateTime列中写入时间。结果应该有下表:

╔═══════════╦══════╦═════════════════════╦═════════════════════╗
║ Shift     ║ Car  ║ isAvaliable_00      ║ isAvaliable_01      ║
║ 190402001 ║ E077 ║ 2019-04-02 02:58:39 ║ 2019-04-02 13:17:58 ║
║ 190402002 ║ E077 ║ 2019-04-02 13:35:10 ║ 2019-04-02 14:35:10 ║
╚═══════════╩══════╩═════════════════════╩═════════════════════╝

在 python 的 pandas 中是否有一些优雅的方法可以做到这一点?谢谢!

4

2 回答 2

0

您可以使用以下函数获取两个日期之间的秒数

import numpy as np

def seconds_between(datestart, dateend):
    "Return seconds between start and end date"
    diff = dateend - datestart
    return diff / np.timedelta64(1, 's')

df['diff'] = seconds_between(df['statusDateTime'].shift(-1),df['statusDateTime'])

现在您所要做的就是在两个日期上进行选择,以找出使用逻辑之间的差异。

于 2020-02-27T06:52:08.243 回答
0

采用简单的类似 SQL 的方法效果很好。

  1. 将行分成两个数据帧,一个是 isAvaliable=0,另一个是 isAvaliable=1。
  2. 外部合并这些数据框。外部合并将解释“isAvaliable”的缺失状态。
df=pd.DataFrame([['2019-04-02 02:58:39','190402001','E077',1],
                 ['2019-04-02 13:17:58','190402001','E077',0],
                 ['2019-04-02 13:35:10','190402002','E077',0],
                 ['2019-04-02 14:35:10','190402002','E077',1]
                ],columns=['statusDateTime','shift','car','isAvaliable'])
df0=df[df['isAvaliable']==0].drop('isAvaliable',axis=1)
df1=df[df['isAvaliable']==1].drop('isAvaliable',axis=1)
new=df1.merge(df0,on=['shift','car'],suffixes=['_1','_0'],how='outer')

这产生:

statusDateTime_1     shift        car    statusDateTime_0
2019-04-02 02:58:39  190402001    E077   2019-04-02 13:17:58
2019-04-02 14:35:10  190402002    E077   2019-04-02 13:35:10

我假设您的问题中有错字。'2019-04-02 13:17:58' 应该轮班 '190402001'

于 2020-02-27T08:20:11.383 回答