日期范围,并在特定时间浏览每个日期

时间:2020-04-30 14:48:52

标签: python django datetime python-datetime timedelta

我正在尝试遍历日期范围(8/1 / 19-3 / 31/20),并遍历每个日期并打印4 AM,5 AM和6 AM小时的计数。但是,在获取所需的日期并进行迭代时,我遇到了一些一般性的麻烦。我不断收到各种datetimedatetime.timedelta错误。

代码如下:

start = datetime.timedelta(2019, 8, 1)
end = datetime.timedelta(2020, 3, 31)
days = (end - start).days + 1
for i in (start + end for n in range(days)):
    for j in range(4, 7):
        print "Hour: ", i
        print ("Residents: ", Checkin.objects.filter(desk__name="Desk", datetime__hour=i.hour(j)).count())
        print("Guests: ", Guest.objects.filter(desk="Desk", datetime__hour=i.hour(j)).count())

我只是希望找到最好的方法,因为我正在尝试为某人收集此数据。我目前从此代码中得到的错误是timedelta没有小时属性。我只是希望获得帮助以使此代码正常工作。

我正在按日期时间字段过滤CheckinGuest

datetime = models.DateTimeField(auto_now_add=True)

3 个答案:

答案 0 :(得分:1)

尝试这个:

import datetime

start = datetime.datetime(2019, 8, 1)
end = datetime.datetime(2020, 3, 31)

# increment the start date until it reaches the end
while start <= end:
    for j in range(4, 7):
        i = start.replace(hour=j) # create the datetime with the desired hour
        print("Hour: ", i)
        print("Residents: ", Checkin.objects.filter(desk__name="Desk", datetime__hour=i).count())
        print("Guests: ", Guest.objects.filter(desk="Desk", datetime__hour=i).count())
    start += datetime.timedelta(days=1) # increment the start date

答案 1 :(得分:0)

这就是我最终要做的:

beg_date = datetime(2019, 8, 1)
        end_date = datetime(2020, 3, 31)
        residents_in_range = Checkin.objects.filter(desk__name="Robinson Hall", datetime__gte=beg_date, datetime__lte=end_date)
        guests_in_range = Guest.objects.filter(desk__name="Robinson Hall", datetime__gte=beg_date, datetime__lte=end_date)
        rez_by_day = []
        guests_by_day = []
        one_day = timedelta(days=1)
        while beg_date <= end_date:
            rez_by_day.append(residents_in_range.filter(datetime__gte=beg_date, datetime__lt=beg_date+one_day))
            guests_by_day.append(guests_in_range_in_range.filter(datetime__gte=beg_date, datetime__lt=beg_date+one_day))
            beg_date += one_day
        four = []
        five = []
        for day in rez_by_day:
            four.append(day.filter(datetime__hour__gte=4, datetime__hour__lt=5))
            five.append(day.filter(datetime__hour__gte=5, datetime__hour__lt=6))
        for count in four:
            print(count.count())
        for count in five:
            print(count.count())

我只是打印数字,以便将其复制并粘贴到excel文件中,所以我只是将列表中的信息进一步分离,并进一步减少并获取了我想要的信息

我尝试填写更多代码,但是我要做的是每次需要不同数据时都要替换大厅和来宾/居民列表。我没有一次解决。

答案 2 :(得分:-1)

尝试保持最初的风格在答案中:

import datetime

start = datetime.datetime(2019, 8, 1)
end = datetime.datetime(2020, 3, 31)
days = (end - start).days + 1


for i in range(days):
    my_datetime = start + datetime.timedelta(days=i)
    print('Processing date', my_datetime)
    for j in range(4, 7):
        my_datetime_with_hour = my_datetime + datetime.timedelta(hours=j)
        print('\t', 'Hour', my_datetime_with_hour)
        q1 = Checkin.objects.filter(
            desk__name="Desk",
            datetime__hour=my_datetime_with_hour.hour,
            )
        q2 = Guest.objects.filter(
            desk="Desk",
            datetime__hour=my_datetime_with_hour.hour,
            )
        print("Residents:", q1.count())
        print("Guests:", q2.count())