Цикл Python while продолжается за пределами условия while

Мой цикл while не останавливается, когда он должен. Очевидно, мне здесь не хватает чего-то фундаментального.

Вот мой код:

import time
import datetime
import pandas as pd
period = 5
start = pd.to_datetime('2022-01-01')
end_final = pd.to_datetime('2022-01-31')
sd = start
while start < end_final:
    ed = sd + datetime.timedelta(period)
    print('This is the start of a chunk')
    print(sd)
    print(ed)
    print('This is the end of a chunk')
    print('+*************************')
    sd = ed + datetime.timedelta(2)

Который печатает даты до 10 апреля 2262 года, а затем выдает ошибку:

 OverflowError: Python int too large to convert to C long

Но цикл while должен остановиться в конце января 2022 года. Есть идеи?

Как вы собираетесь start < end_final стать ложным?

mkrieger1 10.01.2023 22:00

Ни start, ни end_final не меняются, так что это утверждение всегда верно

Libra 10.01.2023 22:00

Возможно, вы хотели while sd < end_final?

Guru Stron 10.01.2023 22:01

Вы изменили sd вместо start, поэтому вы меняете только скопированное значение, хранящееся как sd, а не start, поэтому ваш цикл while проверяет одно и то же условие на каждой итерации.

Karol Milewczyk 10.01.2023 22:03
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
4
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы меняете переменную sd, но проверяете start, попробуйте:

sd = start
while sd < end_final:
    # ...

Когда вы находитесь в «цикле while», вы должны добавить индикатор остановки, такой как флаг, условие или оператор break.

Вот идея разорвать цикл ближе к январю 2022 года.

period = 5
start = pd.to_datetime('2022-01-01')
end_final = pd.to_datetime('2022-01-31')
sd = start
flag = True
while flag:
    ed = sd + datetime.timedelta(period)
    print('This is the start of a chunk')
    print(sd)
    print(ed)
    print('This is the end of a chunk')
    print('+*************************')
    sd = ed + datetime.timedelta(2)
    if sd >= end_final:
        flag = False

Однако конечная дата не 31 января 2022 года, потому что вы добавляете период = 5, поэтому в этом случае попробуйте с операторами «если».

Другие вопросы по теме