Я работаю над простым скриптом Python3, который обрабатывает данные с шагом в пять минут. Благодаря этому посту у меня есть код, который берет любой объект даты и времени Python, а затем округляет его до ближайших пяти минут. (: 00, : 05, : 10, : 15 и т. д.) Обратите внимание, что я не могу использовать панд.
Теперь мне нужно иметь возможность сравнить это «округленное» время и дату с другими датами, и здесь я столкнулся с проблемой. Рассмотрим этот тестовый код:
import sys
from datetime import datetime
from datetime import timedelta
def roundDownDateTime(dt):
# Arguments:
# dt datetime object
delta = timedelta(minutes=1) * (dt.minute % 5)
return dt - delta
def testAlarm(testDate):
# Arguments:
# testDate datetime object
currDate = roundDownDateTime( datetime.now() ) # currDate is a DateTime object, rounded down to 5 mins
print("currDate: "+currDate.strftime("%Y%m%d%H%M"))
print("testDate: "+testDate.strftime("%Y%m%d%H%M"))
if (currDate == testDate):
print("ALARM!!!!")
def main():
testDate = datetime.strptime(sys.argv[1], "%Y%m%d%H%M")
testAlarm(testDate)
if __name__ == "__main__":
main()
Код делает все следующее:
main()
принимает строку, которую вы вводите в командной строке,
затем преобразует его в "%Y%m%d%H%M"
datetimetestAlarm()
ваша дата сравнивается с текущей датой, также в
"%Y%m%d%H%M"
, также с округлением до пяти минут в меньшую сторону."ALARM!!!
в выводе.Вот фактический результат, запущенный на моем компьютере с Ubuntu:
me@unbuntu1$ date
Tue Jan 17 14:27:41 UTC 2023
me@unbuntu1$
me@unbuntu1$ python3 toy04.py 202301171425
currDate: 202301171425
testDate: 202301171425
me@unbuntu1$
Хорошо: хотя я округляю свою дату в меньшую сторону, чтобы она соответствовала «округленной» версии текущей даты, строка кода if (currDate == testDate):
по-прежнему оценивается как False
. Хотя обе даты и времени выглядят равными в формате "%Y%m%d%H%M"
, они каким-то образом не равны.
Моя первая мысль заключалась в том, что, возможно, «округленная» дата-время все еще сохраняет некоторые остаточные секунды или микросекунды даже после части округления? Поэтому я изменил свою функцию на это:
def roundDownDateTime(dt):
# Arguments:
# dt DateTime object
delta = timedelta(minutes=1) * (dt.minute % 5)
dt = dt - delta
dt.replace(second=0, microsecond=0)
return dt
Но это не имеет значения; Я все еще получаю тот же результат, что и раньше.
Обычно вас волнует только currDate > testDate
в тревожных целях. Но в моем случае я должен иметь возможность сравнивать дату и время на равенство после того, как один (или несколько) из них прошел через функцию roundDownDateTime()
. Что мне не хватает? Моя функция roundDownDateTime()
неисправна? Спасибо.
Вы печатаете strftime
, но сравниваете объект даты и времени для currDate
, которые не равны из-за десятичных знаков.
@It_is_Chris Это отличный момент, вероятно, источник моего замешательства. Интересно, какой рекомендуемый способ печати даты и времени?
dt.replace
возвращает новый datetime
объект; он не изменяется dt
на месте.
def roundDownDateTime(dt):
# Arguments:
# dt DateTime object
delta = timedelta(minutes=1) * (dt.minute % 5)
dt = dt - delta
return dt.replace(second=0, microsecond=0)
Скорее всего это ошибка округления с плавающей запятой