Python 减去两个包含datetime.time的numpy数组
在我的脚本中,我得到了两个巨大的np数组,我想减去它们。第一个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)
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])