【问题标题】:Transforming a categorical column into columns in python将分类列转换为python中的列
【发布时间】:2020-02-27 05:10:46
【问题描述】:

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

╔═════════════════════╦═══════════╦══════╦═════════════╗
║ 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_0 >isAvaliable_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 中是否有一些优雅的方法可以做到这一点? 谢谢!

【问题讨论】:

    标签: python algorithm data-wrangling


    【解决方案1】:

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

    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'])
    

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

    【讨论】:

      【解决方案2】:

      采用简单的类似 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'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-08
        • 1970-01-01
        • 2021-11-16
        • 1970-01-01
        • 2021-09-22
        • 2020-10-07
        • 2020-12-18
        相关资源
        最近更新 更多