如何解决给定日期开始和日期结束,请以24个值的数组的形式提供与一天中的小时相对应的持续时间
我对Django rest框架非常陌生,甚至堆栈溢出,我都在努力寻找标题,因此请随时提供更好的选择。
我有一组作业被发布到数据库中。现在,将作业按计算机和给定小时分组。目前,我仅显示每小时的总工作量。我的API端点现在看起来像这样: Api end point
我在这里苦苦挣扎:我需要将工作时间按小时分开。我有一个Datetime何时开始和一个Datetime何时结束。我也有一个持续时间。 例如:假设作业在11h15开始并在12h15结束。这意味着11个小时的总时长为45分钟。对于12小时,持续时间为15分钟。
我想到的是在11h15和12h00之间经过时间,然后在12h15和13h00之间经过时间。但是我不确定我该怎么做。还请注意,有些工作要花一个小时以上,有些甚至要花一天以上。我敢肯定,有一种特定的方法可以在Python中使用timedelta做到这一点。我只是没有足够的经验来理解这一点。
这是API端点的当前代码:
class MachineDurationViewSet(APIView):
authentication_classes = (SessionAuthentication,DataAppClientTokenAuthentication)
def get(self,request):
# get names of all machines
machine_names_queryset = Machine.objects.all()
machine_names = []
for obj in machine_names_queryset:
machine_names.append(obj.name)
machine_list = {}
sum = []
queryset = Job.objects.all()
# per machine,get dur for a given hour,use names to filter
for name in machine_names:
qs_grouped_per_machine = queryset.filter(machine__name=name)
queryset_machine_start = qs_grouped_per_machine.annotate(hour=ExtractHour('dt_start'))
queryset_machine_end = qs_grouped_per_machine.annotate(hour=ExtractHour('dt_end'))
for n in range(0,24):
job_start = queryset_machine_start.filter(hour=n)
for job in job_start:
print(job.dt_start)
sum.append(job_start.count())
machine_list[name] = sum
sum = []
return Response({"machines": machine_list,"machine_count": len(machine_names)})
解决方法
这似乎很有效,解释在代码中。希望您可以将其提取为函数并在您的上下文中使用:
from datetime import datetime
from datetime import timedelta
start = datetime(2019,2,15,38,42) #datetime.now(tz=None)
hours_added = timedelta(minutes = 150) # change to eg. 1500
end = datetime(2019,39,1) #start + hours_added
diff = end - start
print("Start ",start)
print("End",end)
dates_spent = []
SECONDS_IN_HOUR = 3600
full_hours = int(diff.seconds / 3600) + 1 # get hours the task took rounded (ceiling)
for i in range(full_hours + 1): # add '1' because we want to include last 'touched' hour as well
if i == 0:
# store first datetime
dates_spent.append(start)
if i == full_hours or full_hours == 1: # job spanned only some minutes within same hour
# store last datetime and ignore next hour
dates_spent.append(end)
break
next_hh = start + timedelta(hours=i + 1)
# truncate minutes as we need full hours
next_hh = datetime(next_hh.year,next_hh.month,next_hh.day,next_hh.hour)
dates_spent.append(next_hh)
print("***")
for d in dates_spent:
print(d)
print("***")
minutes_as_array = [None]*24
for i in range(len(dates_spent) - 1):
# get time difference between 'next' hour spent and 'current'
minutes_in_hour_spent = dates_spent[i + 1] - dates_spent[i]
print("minutes spent: {},in hour: {}".format(minutes_in_hour_spent,dates_spent[i]))
minutes_as_array[dates_spent[i].hour] = minutes_in_hour_spent.seconds / 60
print("===")
print(minutes_as_array)
对于我的测试数据,它产生:
Start 2019-02-15 00:38:42
End 2019-02-15 00:39:01
***
2019-02-15 00:38:42
2019-02-15 00:39:01
***
minutes spent: 0:00:19,in hour: 2019-02-15 00:38:42
===
[0.31666666666666665,None,None]
因此,在索引11上,我们将有25分钟,60分钟,60分钟和4分钟的时间。
但这只能用一天-如果一项工作跨越数天,则必须创建更复杂的结构,例如二维数组,其中第一维为“ day”(例如一个月),然后一个小时。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。