日期范围,并在某一小时内通过每个日期。

问题描述 投票:0回答:1

我试图在一个日期范围(8119-33120)中进行迭代,并检查每个日期并打印出凌晨4点、5点和6点的计数。然而,我在获取所需的日期和迭代时遇到了一些问题。我一直得到各种 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)

python datetime python-datetime timedelta
1个回答
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

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文件中 我只是把列表中的信息分开,进一步减少并得到我想要的信息。

我试着多填一些代码,但我做的是每次要不同的数据时,都要更换大厅和客人居民列表。我不是一次就能完成的。


-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())
© www.soinside.com 2019 - 2024. All rights reserved.