【问题标题】:TypeError: cannot subtract DatetimeArray from ndarrayTypeError:无法从 ndarray 中减去 DatetimeArray
【发布时间】:2020-12-17 05:13:31
【问题描述】:

我的数据框中有两列 - 开始日期和完成日期(这是一个时间戳)。我想通过找出差异来计算运行时间。当我运行下面的代码时,我收到错误:TypeError: cannot subtract DatetimeArray from ndarray。我也无法将完成日期列拆分为日期和时间,因此我可以用另一种方式计算运行时间。

# calculate runtime 
pd.to_datetime(df.start_date)
pd.to_datetime(df.finish_date)

diff = pd.to_datetime(df.finish_date) - pd.to_datetime(df.start_date)

这是数据框的样子: df

file_name                unique_id                                      start_date                         finish_date
        
file1         1716b94a8d8d83c8fffe4bdd14d536ae1ee9cba6bf17e6...   2020-09-03T16:18:38.929863799Z          2020-09-03T16:20:17.615093582Z
        
file2         87ff84ab119b798312230fceb3a8730fe74669a373650a...   2020-09-03T16:26:25.075167073Z          2020-09-04T00:04:39.702686798Z

我该怎么做-

  1. 是否找到完成日期和开始日期之间的差异?
  2. 将列拆分为日期和时间。

【问题讨论】:

    标签: pandas python-datetime


    【解决方案1】:

    假设您要计算日期之间的天数,那么这是一种解决方案:

    import datetime as dt
    diff = (pd.to_datetime(df.finish_date) - pd.to_datetime(df.start_date)).dt.days
    

    编辑

    另一种选择是

    Start = pd.to_datetime(df.finish_date)
    End  = pd.to_datetime(df.start_date)
    End.subtract(Start)
    

    示例:这里我选择计算 df 中的日期与现在之间的差异。

    metric_id device_id            timestamp  cpu_5min  vol_max
    0          device_1  2020-12-04 05:15:00     116.0    734.0
    1          device_1  2020-12-04 05:30:00     213.0    325.0
    2          device_1  2020-12-04 05:35:00     427.0    668.0
    3          device_2  2020-12-04 05:15:00     540.0      NaN
    4          device_2  2020-12-04 05:30:00     127.0      NaN
    5          device_2  2020-12-04 05:35:00     654.0      NaN
    

    df['tDATE'] = pd.to_datetime(df['timestamp'])
    df['DIFF1'] = (df['tDATE'] - dt.datetime.now()).dt.days  #method 11
    df['DIFF2'] = df['tDATE'].subtract(dt.datetime.now()) #method2
    

    返回

    metric_id device_id            timestamp  cpu_5min  vol_max  \
    0          device_1  2020-12-04 05:15:00     116.0    734.0   
    1          device_1  2020-12-04 05:30:00     213.0    325.0   
    2          device_1  2020-12-04 05:35:00     427.0    668.0   
    3          device_2  2020-12-04 05:15:00     540.0      NaN   
    4          device_2  2020-12-04 05:30:00     127.0      NaN   
    5          device_2  2020-12-04 05:35:00     654.0      NaN   
    
    metric_id               tDATE  difd  DIFF1                     DIFF2  
    0         2020-12-04 05:15:00   -14    -14 -14 days +22:13:26.627607  
    1         2020-12-04 05:30:00   -14    -14 -14 days +22:28:26.627607  
    2         2020-12-04 05:35:00   -14    -14 -14 days +22:33:26.627607  
    3         2020-12-04 05:15:00   -14    -14 -14 days +22:13:26.627607  
    4         2020-12-04 05:30:00   -14    -14 -14 days +22:28:26.627607  
    5         2020-12-04 05:35:00   -14    -14 -14 days +22:33:26.627607  
    

    编辑:使用时间戳

    从下面的 cmets 可以看出,上面的示例需要准备,因为您正在使用此时间戳记。请注意,这就是为什么在提问时提供足够的信息很重要(例如,您正在处理什么样的数据)。当涉及到日期时,这一点甚至更重要,因为有许多格式。这是您在 cmets 中提供的日期格式的示例:

    import datetime as dt
    
    Date = '2020-09-03T16:18:38.929863799Z'
    Date2  = '2020-10-03T16:18:38.929863799Z'
    

    这里有Timestamps,所以第一步是将它们转换为datetime,然后使用to_pydate(它曾经被称为Timestamp.to_datetime(),但现在已弃用。

    Date = pd.to_datetime(Date)
    Date2  = pd.to_datetime(Date2)
    
    DATE_1 = Date.to_pydatetime()
    DATE_2 = Date2.to_pydatetime()
    

    之后您可以计算差异

    DIFF = (pd.to_datetime(DATE_1) -pd.to_datetime(DATE_2))
    
    

    这是Timedelta('-30 days +00:00:00')

    【讨论】:

    • 更像是几分钟,而不是几天。
    • 试过了,我得到了同样的错误:cannot subtract DatetimeArray from ndarray
    • 感谢您的详细解释。我很感激。我收到一个错误:UFuncTypeError: ufunc 'subtract' cannot use operands with types dtype('<M8[ns]') and dtype('O') 在我看来,我的数据框中的日期时间时间戳的数据类型不正确。我从来没有见过这么多不同的错误。
    • 您如何使用2020-09-03T16:18:38.929863799Z 格式的时间来处理您的示例,或者将时间戳转换为您希望能够使用减法函数的格式?
    • 我已经完成了处理时间戳的答案。如果它是您要查找的内容,请将其选中,以便它从未回答的问题中消失。
    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多