Диапазон дат и go через каждую дату в определенный час - PullRequest
1 голос
/ 30 апреля 2020

Я пытаюсь перебрать диапазон дат (8/1 / 19-3 / 31/20) и go по каждой дате и распечатать счет за часы 4, 5 и 6 утра. Тем не менее, у меня есть некоторые общие проблемы с получением необходимых дат и повторений. Я получаю различные ошибки 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)

Ответы [ 3 ]

1 голос
/ 30 апреля 2020

Попробуйте это:

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 голосов
/ 30 апреля 2020

Иллюстрация моего комментария (ей):

Для каждого дня в диапазоне дат мы создаем объект datetime.datetime, добавляя дни текущей итерации в качестве объекта datetime.timedelta. Чтобы получить нужные часы, мы заменим hour объекта datetime.datetime и передадим этот объект Checkin и Guests.

import datetime
start, end = datetime.datetime(2019, 8, 1), datetime.datetime(2020, 3, 31)
days = (end - start).days + 1
for d in range(days):
    date = start + datetime.timedelta(days=d)
    for h in range(4, 7):
        print("Time & Date: ", date.replace(hour=h))
        print("Residents: ", Checkin.objects.filter(desk__name="Desk", datetime__hour=date.replace(hour=h)).count())
        print("Guests: ", Guest.objects.filter(desk="Desk", datetime__hour=date.replace(hour=h)).count())
0 голосов
/ 30 апреля 2020

Пытаясь сохранить свой первоначальный стиль ответа:

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())
...