2017-02-13 108 views
0

我找到了一些解決方案,但大多數都在討論當前日期。我想要的是檢查當前時間是否在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 它仍然無法與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_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的方式去做

+0

對我來說,它看起來像你有你需要的所有代碼段,但你組裝它錯誤的方式。問題是,你從當前時間減去一天,無論你是否需要。你能想出一個可能的解決方案嗎?這總是比得到其他人編寫的答案要好... – nostradamus

+0

使用'test = cur_time.date()

+0

我不能使用'today()',因爲'cur_time'來自csv文件,我需要與csv文件中提到的時間和日期進行比較。 –

回答

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 

爲了精確起見,我假設從6比3的山東肥城的變化,在上午07點就點,並回至6日晚上11點在點。

+0

之間同一天查看的感謝您的解決方案乾淨,只需稍作修改就可以工作了......在編輯3中發佈代碼 –

+1

可以通過使用'datetime'對象的'hour'屬性來簡化:'7 <= cur_date.hour <23' –

0

忽略比較期間的日期,並檢查時間是否> 23:00或< 07: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 
+0

它不會是'或'。這將是'和'。此外,我不能拒絕日期。我必須採取日期和時間。因爲直到'2/9/16 23:30'與'2/9/16 22:00'比較必須在'2/10/16 00:00'完成,所以不能用'2/10/16 22:00' –

+0

'00:00'和'07:00'之間的每一'次日'都是在'00:00'和'07:00' – Vanojx1

相關問題