【问题标题】:How to check if a time is within a range with date如何检查时间是否在日期范围内
【发布时间】:2017-02-13 07:27:30
【问题描述】:

我找到了一些解决方案,但其中大多数都在谈论当前日期。我想要的是检查当前时间是否在第二天23:00:0007: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 正如@a_guest 所指出的,它仍然不能与timedelta 一起使用。 这是代码

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_time00: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)

能否进一步改进。我敢打赌必须有一种更 Pythonic 的方式来做到这一点

【问题讨论】:

  • 对我来说,看起来您拥有所需的所有代码段,但是您以错误的方式组装它。问题是你从当前时间中减去一天,不管你是否必须这样做。你能自己想出一个可能的解决办法吗?这总是比得到别人编造的答案要好......
  • 使用test = cur_time.date() &lt; datetime.today().date()有什么问题?
  • 我不能使用today(),因为cur_time来自一个csv文件,我需要与csv文件中提到的时间和日期进行比较。
  • @nostradamus 如果我不从中减去一天,那么如果当前时间是 00:00:00 将其与 22:00:00 进行比较是行不通的,因为它将与未来的同一日期进行比较@ 987654350@ o'clock 不是上一个日期
  • 是的,这就是我的意思......所以你需要一个 if 语句,并且根据它你必须在当天减去/添加一些东西。如果您可以添加更多示例(输入 --> 结果),我会更好地理解并且可能会为您提供解决方案。

标签: python datetime


【解决方案1】:

听起来最简单的解决方案是完全摆脱日期,并自行比较小时值。如果给定时间大于早上 7 点但小于晚上 11 点,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 点,然后在当日晚上 11 点恢复到 6 点。

【讨论】:

  • 感谢您的解决方案看起来很干净,几乎没有修改它也可以工作...在编辑 3 中发布代码
  • 您可以通过使用datetime 对象的hour 属性来简化它:7 &lt;= cur_date.hour &lt; 23
【解决方案2】:

在比较期间忽略日期并检查时间是 > 23:00 还是 fiddle:

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

【讨论】:

  • 不会是or。应该是and。此外,我不能拒绝日期。我必须同时考虑日期和时间。因为直到2/9/16 23:30 必须与2/9/16 22:00 进行比较,但在2/10/16 00:00 处,无法与2/10/16 22:00 进行比较
  • 在 '00:00' 和 '07:00' 之间的每个 'next day' 与检查 '00:00' 和 '07:00' 之间的同一天是一样的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
相关资源
最近更新 更多