[英]How to check if a time is within a range with date
我找到了一些解决方案,但大多数都在谈论当前日期。 我想要的是检查当前时间是否在23:00:00
和07:00:00
内。 我面临困难,因为日期也涉及到这一点。 因此,如果当前时间是00:00:00
那么日期也会更改,将时间与当天23:00:00
进行比较会给我带来错误的结果。 这就是我现在想出的。 请帮助我找到解决方案
cur_time = dt.strptime('2/9/16 00:00', "%m/%d/%y %H:%M")
prev_date = dt.strftime(cur_time.date() - timedelta(days=1), "%m/%d/%y")
same_date = dt.strftime(cur_time.date(), '%m/%d/%y')
dosta = dt.strptime(prev_date + "22:00", "%m/%d/%y%H:%M")
satta = dt.strptime(same_date + "07:00", "%m/%d/%y%H:%M")
if dosta < cur_time < satta:
tariff = 3
else:
tariff = 6
print(tariff)
这将导致关税为3,但是如果我这样更改cur_time
cur_time = dt.strptime('2/9/16 23:00', "%m/%d/%y %H:%M")
这不会产生3。这会给我6。因为这会将当前时间与前一天00:00
,今天07:00
和当前23:00
进行比较。
编辑1
Input: 2/9/16 06:00:00
Output: 3...because 06:00:00 is less than 07:00:00 that same day(2/9/2016) and more than 22:00:00 previous day(2/8/16)
Input: 2/9/16 23:00:00
Output: 3...because 23:00:00 is more than 22:00:00 that same day(2/9/2016)
Input: 2/10/16 00:30:00
Output: 3...because 00:30:00 is more than 22:00:00 that previous day(2/9/2016) and less than 07:00:00 same day(2/10/2016)
Input: 2/10/16 08:00:00
Output: 6...because 08:00:00 is more than 07:00:00 that same day(2/9/2016) and less than 22:00:00 on the same day(2/9/2016)
编辑2如timedelta
所指出的,它仍然无法使用@a_guest
。 这是代码
for each in zip(data1, data2):
# client.write_points(json_body_bill_data)
cur_time = dt.strptime(each[1]['Start'], "%m/%d/%y %H:%M")
# print(cur_time.date())
dosta = dt.strptime('2200', '%H%M').time()
# print(dosta)
lower = datetime.datetime.combine(cur_time.date(), dosta)
upper = lower + timedelta(hours=8.5)
print("lower", lower)
print("upper", upper)
print(cur_time, lower < cur_time < upper)
这是给我的错误,如果cur_time
是00:00:00 9/2/16
编辑3
可能的答案
from datetime import datetime, time
import csv
import os
CSV_FILE_ASCO = os.path.join('..', 'res', 'ASCO_METER.csv')
with open(CSV_FILE_ASCO, 'r') as f:
reader = csv.DictReader(f)
data = list(reader)
for each in data:
# print()
cur_date = datetime.strptime(each['Start'], "%m/%d/%y %H:%M")
if time(7, 0) <= cur_date.time() < time(22, 0):
tarrif = 6
else:
tarrif = 3
print(cur_date, end=" ")
print(tarrif)
可以进一步改进。 我敢肯定,必须有一种更Python化的方式来做到这一点
听起来最简单的解决方案是完全删除日期,然后自己比较小时值。 如果给定时间大于7 AM但小于11 PM,则tarrif = 3
,否则tarrif = 6
。 您可以使用datetime
对象的hour
属性来执行此操作:
from datetime import datetime
cur_date = datetime.strptime('2/9/16 07:00', "%m/%d/%y %H:%M")
if 7 <= cur_date.hour < 23:
tarrif = 3
else:
tarrif = 6
为了精确起见,我假设tarrif在该点的上午7点从6变为3,然后在该点的11PM变为6。
在比较期间忽略日期,并检查时间是否> 23:00或<07:00。 检查工作提琴 :
import datetime
dosta = datetime.datetime.strptime("23:00", '%H:%M')
satta = datetime.datetime.strptime("07:00", '%H:%M')
print dosta.time(), satta.time()
for h in range(0,24):
h = str(h).zfill(1)
cur_time = datetime.datetime.strptime('2/9/16 {h}:00'.format(h=h), "%m/%d/%y %H:%M")
if cur_time.time() > dosta.time() or cur_time.time() < satta.time():
print "IN RANGE " + h
else:
print "OUT OF RANGE " + h
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.