我正在尝试遍历日期范围(8/1 / 19-3 / 31/20),并遍历每个日期并打印4 AM,5 AM和6 AM小时的计数。但是,在获取所需的日期并进行迭代时,我遇到了一些一般性的麻烦。我不断收到各种datetime
和datetime.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没有小时属性。我只是希望获得帮助以使此代码正常工作。
我正在按日期时间字段过滤Checkin
和Guest
,
datetime = models.DateTimeField(auto_now_add=True)
答案 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())