Python 减去两个包含datetime.time的numpy数组

Python 减去两个包含datetime.time的numpy数组,python,numpy,datetime,Python,Numpy,Datetime,在我的脚本中,我得到了两个巨大的np数组,我想减去它们。第一个numpy数组start\u per\u day包含工作日开始的时间,第二个numpy数组end\u per\u day。 然而,我得到下面的错误。无法理解,感谢您的帮助。 编辑:下面是一个最小的可复制示例,其中阵列是由我人工创建的 Edit2:由于有人多次询问我的两个datetime.time numpy数组的起源,我用min和max从pandas groupby中提取了它们,请参见下面的代码 print(one_employe)

在我的脚本中,我得到了两个巨大的np数组,我想减去它们。第一个numpy数组
start\u per\u day
包含工作日开始的时间,第二个numpy数组
end\u per\u day
。 然而,我得到下面的错误。无法理解,感谢您的帮助。 编辑:下面是一个最小的可复制示例,其中阵列是由我人工创建的 Edit2:由于有人多次询问我的两个datetime.time numpy数组的起源,我用min和max从pandas groupby中提取了它们,请参见下面的代码

print(one_employe)
start_per_day = one_employe.groupby('Date')['Time'].min()
end_per_day = one_employe.groupby('Date')['Time'].max()
print(end_per_day.values)
print(start_per_day.values)
3个打印命令的输出

原始邮政编码:

import datetime
import numpy as np
start_per_day = np.array([datetime.time(9, 43),datetime.time(9, 51)])
end_per_day = np.array([datetime.time(18,22),datetime.time(18,29)])

#Attemps that didnt work:
np.datetime64(end_per_day) - np.datetime64(start_per_day)
datetime.timedelta( end_per_day, start_per_day)
end_per_day - start_per_day
错误:

import datetime
import numpy as np
start_per_day = np.array([datetime.time(9, 43),datetime.time(9, 51)])
end_per_day = np.array([datetime.time(18,22),datetime.time(18,29)])

#Attemps that didnt work:
np.datetime64(end_per_day) - np.datetime64(start_per_day)
datetime.timedelta( end_per_day, start_per_day)
end_per_day - start_per_day
TypeError:-:“datetime.time”和“datetime.time”的操作数类型不受支持


您可以使用
datetime.timedelta
而不是
datetime.time

import datetime
import numpy as np

start_per_day = np.array([datetime.timedelta(hours=9, minutes=43), datetime.timedelta(hours=9, minutes=51)])
end_per_day = np.array([datetime.timedelta(hours=18, minutes=22), datetime.timedelta(hours=18, minutes=29)])

delta_per_day = end_per_day - start_per_day

print(delta_per_day[0])
print(delta_per_day[1])

我正在寻找一种减去
datetime.time
对象的方法,但我找不到任何方法


转换测试(无回路):



datetime.time
对象数组转换为
datetime.timedelta
对象数组:

def time_to_delat(t):
    """Convert datetime.time object with hour and minute to datetime.timedelta object"""
    dt = datetime.timedelta(hours=t.hour, minutes=t.minute)
    return dt

start_per_day = np.array([datetime.time(9, 43),datetime.time(9, 51)])
end_per_day = np.array([datetime.time(18, 22), datetime.time(18, 29)])

# Convert array of datetime.time objects to array of datetime.timedelta objects
start_per_day_dt = np.array([time_to_delat(x) for x in start_per_day])
end_per_day_dt = np.array([time_to_delat(x) for x in end_per_day])

delta_per_day = end_per_day_dt - start_per_day_dt

print(delta_per_day[0])
print(delta_per_day[1])

datetime.time
对象不实现加法或减法
start\u per\u day
是一个
time
对象数组;它只能进行这些对象实现的数学运算(如果有的话)。
numpy
可以对
np.datetime64
d类型进行快速数学运算,但不能进行
datetime
对象。了解您是如何创建这些数组的可能会有所帮助。对象数据类型数组通常不如列表。那些
time
物品是由其他代码交给你的吗?您不能直接从文件中读取它们。@hpaulj我编辑了
datetime.time
np数组的原始数据。谢谢您的回答。我将检查是否有方法将np数组转换为timedelta。然而,以上只是一个最小的可复制示例。在完整的脚本中,我不会手动创建这些数组。我将编辑OP以澄清我添加的转换测试
def time_to_delat(t):
    """Convert datetime.time object with hour and minute to datetime.timedelta object"""
    dt = datetime.timedelta(hours=t.hour, minutes=t.minute)
    return dt

start_per_day = np.array([datetime.time(9, 43),datetime.time(9, 51)])
end_per_day = np.array([datetime.time(18, 22), datetime.time(18, 29)])

# Convert array of datetime.time objects to array of datetime.timedelta objects
start_per_day_dt = np.array([time_to_delat(x) for x in start_per_day])
end_per_day_dt = np.array([time_to_delat(x) for x in end_per_day])

delta_per_day = end_per_day_dt - start_per_day_dt

print(delta_per_day[0])
print(delta_per_day[1])