我正在尝试每个sleep_time
运行python脚本,但是我希望此sleep_time
变量根据一天中的当前时间进行更改。该程序用于分析库存数据,因此在白天(上午8:30至下午5:30),我希望该程序每60秒更新一次其数据。如果不在此时间之间,我只需要每10分钟更新一次。我当前拥有的代码如下:
sleep_time = 60
ts = time.time()
st = datetime.datetime.fromtimestamp(ts).strftime('%H:%M')
if (st >= '8:30' and st <='17:30'):
sleep_time = 60
if(st < '8:30' and st >'17:30'):
sleep_time = 600
while True:
#runs this code every sleep_time seconds to constantly update
...
time.sleep(sleep_time)
但是我无法使用它,因为st
是一个字符串,而且我不确定如何比较这样的字符串。任何帮助将不胜感激
答案 0 :(得分:2)
Python有一个datetime模块,该模块提供了datetime数据类型。
您可以在两个甚至三个日期时间之间进行比较。
datetime.now()为您提供当前本地日期和时间的时间戳,而datetime.today()也为您提供当前本地日期和时间的时间戳。您可以用datetime.replace()替换日期时间数据类型的特定值。
from datetime import datetime
while True:
#You should define sleep_time inside the loop. Otherwise it won't change for the rest of the loop.
if datetime.today().replace(hour=8, minute=0, second=0, microsecond=0) <= datetime.now() <= datetime.today().replace(hour=15, minute=30, second=0, microsecond=0):
sleep_time = 60
else:
sleep_time = 600
#your code here
time.sleep(sleep_time)
您可能想知道datetime.now()和datetime.today()有什么区别,因为它们产生相同的结果。
根据文档,datetime.now()比datetime.today()更准确,并且对于时区可能需要一个tz
arg。
答案 1 :(得分:0)
我只是将时间分为小时和分钟,然后将它们转换为整数。然后,您可以计算总分钟数并将其与任何时间(8:30-> 510、17:30-> 1050)进行比较。
# rest of implementation
time_h = datetime.datetime.fromtimestamp(ts).strftime('%H')
time_m = datetime.datetime.fromtimestamp(ts).strftime('%M')
total_min = int(time_h) * 60 + int(time_m)
if (total_min >= 510 and total_min <= 1050):
sleep_time = 60
if(total_min < 510 and total_min > 1050):
sleep_time = 600
# rest of implementation
如何在几分钟内找到时间:60 * hours + minutes
答案 2 :(得分:0)
一方面,您有datetime.datetime
个对象,另一方面,您有字符串。两者不可比,因此必须将其中一种转换为另一种(两种方式都有可能),以便能够进行比较。
关键是比较时,结果应与您要比较的结果兼容。
检查[Python 3]: strftime() and strptime() Behavior中有关转换的规则。
您决定将所有内容都转换为字符串(这是最直接的方法,特别是对于经验不足的人(它可以正常工作,并且非常好),尽管我建议反之亦然) 。在 Python 中(实际上我不知道用哪种编程语言来处理不同的事物),字符串是按<字典>字母顺序([Wikipedia]: Lexicographical order)或按字母顺序比较的。>
让我们看一下转换:
>>> datetime.datetime.fromtimestamp(time.time()).strftime('%H:%M') '04:29'
如所见,小于10的数字(代表小时,分钟)留有 0 ( 0 为 00 ),并且您的字符串应遵循相同的规则。
因此,将您的'8:30'字符串修改为' 0 8:30'应该可以解决问题,因为例如< em> '11:26'是:
'1' < '8'
)-这显然是错误的'1' > '0'
)-正确