【问题标题】:Creating new column based on time value based if statement基于时间值的if语句创建新列
【发布时间】:2018-12-27 02:40:30
【问题描述】:

我正在尝试创建一个列,该列给出其他两列的两个时间戳的方差或减法。

def time_delta(df):
    if df['a_time'] > df['b_time']:
        df = (pd.to_datetime(df.a_time) - pd.to_datetime(df.b_time)) / np.timedelta64(1, 'm')
    else:
        df = (pd.to_datetime(df.b_time) - pd.to_datetime(df.a_time)) / np.timedelta64(1, 'm')
    return df

df['C'] = df.apply(time_delta, axis=1)

当我运行代码的应用部分时,单元格一直以 * 运行,我错过了什么吗?

非常感谢

【问题讨论】:

    标签: python pandas function datetime if-statement


    【解决方案1】:

    不要将结果分配给“df”,而是将其更改为不同的变量。

    def time_delta(df):
        if df['a_time'] > df['b_time']:
            res = (pd.to_datetime(df.a_time) - pd.to_datetime(df.b_time)) / np.timedelta64(1, 'm')
        else:
            res = (pd.to_datetime(df.b_time) - pd.to_datetime(df.a_time)) / np.timedelta64(1, 'm')
        return res
    

    【讨论】:

      【解决方案2】:

      您的逻辑过于复杂。 pd.DataFrame.apply 表示的逐行循环应该在 Pandas 中积极避免。在这里,您可以将timedelta 系列转换为秒,然后取绝对值:

      df = pd.DataFrame({'a_time': pd.to_datetime(['2018-01-01 05:32:00', '2018-05-10 20:13:41']),
                         'b_time': pd.to_datetime(['2018-01-01 15:10:05', '2018-05-10 16:09:16'])})
      
      df['C'] = (df['b_time'] - df['a_time']).dt.total_seconds().abs() / 60
      
      print(df)
      
                     a_time              b_time           C
      0 2018-01-01 05:32:00 2018-01-01 15:10:05  578.083333
      1 2018-05-10 20:13:41 2018-05-10 16:09:16  244.416667
      

      出于学术目的,这就是您将使用apply的方式:

      def time_delta(row):
          if row['a_time'] > row['b_time']:
              return (row['a_time'] - row['b_time']) / np.timedelta64(1, 'm')
          else:
              return (row['b_time'] - row['a_time']) / np.timedelta64(1, 'm')
      
      df['C'] = df.apply(time_delta, axis=1)
      

      请注意,在这两个版本中,我们假设您从datetime 系列开始。如果不是这种情况,请确保您转换为 datetime 作为初始步骤:

      time_cols = ['a_time', 'b_time']
      df[time_cols] = df[time_cols].apply(pd.to_datetime)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-09
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多