2014-02-07 25 views
1

我想編寫一個程序,允許用戶在開始時間小時,結束時間小時和分區數輸入。Python時間數學

因此,他們可能會輸入9,10和4,這意味着開始時間爲上午9:00,結束於上午10:00,並將範圍分割4次,從而產生9:00,9:15的輸出,9:30,9:45。

我試過使用時間模塊和日期時間,但無法獲得額外的工作時間。我不在乎約會。

我可以計算時間分割,但實際除了開始時間是逃避我。

我有大量的代碼,以下是大多數我試圖找出如何使這項工作。我嘗試添加分鐘,嘗試轉換爲秒,鑽入日期時間,嘗試時間模塊,但似乎無法使其工作。有很多關於如何「現在增加15分鐘」的例子,但問題是我不想從「現在」開始,而是讓用戶決定開始時間。

謝謝。

time_start = "9" 
time_end = "10" 
time_split = "4" 


if len(time_start) == 1: 
    time_start = "0" + str(time_start) + ":00" 
else: 
    time_start = str(time_start) + ":00" 

if len(time_end) == 1: 
    time_end = "0" + str(time_end) + ":00" 
else: 
    time_end = str(time_end) + ":00" 

print time_start 
print time_end 

s1 = time_start + ':00' 
s2 = time_end + ':00' 
FMT = '%H:%M:%S' 
tdelta = datetime.strptime(s2, FMT) - datetime.strptime(s1, FMT) 
divided = tdelta/int(time_split) 

print tdelta 
print divided 
s3 = str(divided) 
print "s1 time start: " + str(s1) 
print "s2 time end: " + str(s2) 
print "s3 time divided: " + str(s3) 
ftr = [3600,60,1] 
add_seconds = sum([a*b for a,b in zip(ftr, map(int,s3.split(':')))]) 
print "s3 time divided seconds: " + str(add_seconds) 
print "time delta: " + str(tdelta) 
+0

你必須先回答一些關鍵問題:你如何處理拆分天(例如晚上10點 - 凌晨2點)? 12或24小時制(例如,10 =上午10:00或下午10:00)? –

+0

此外,您如何計劃處理輸入,如9,10和7,其中拆分並不那麼簡單。 – Jordonias

+0

@Manish請看看我對我的回答所做的修改 - 我的新實現更清晰,更優雅地處理關於不愉快時間分割的問題。 –

回答

0

編輯:我做了一點研究,發現了一個更好的解決方案,優雅地處理毫秒分辨率。請執行這個代碼,而不是(雖然我會保存舊代碼爲後人)

import datetime 

start_time = 9 # per user input 
end_time = 10 # per user input 
divisions = 7 # per user input 

total_time = end_time - start_time 
start_time = datetime.datetime.combine(datetime.date.today(),datetime.time(start_time)) 
end_time = start_time + datetime.timedelta(hours=total_time) 

increment = total_time*3600000//divisions # resolution in ms 

times = [(start_time+datetime.timedelta(milliseconds=increment*i)).time() 
     for i in range(divisions)] 

from pprint import pprint 

pprint(list(map(str,times))) 

# ['09:00:00', 
# '09:08:34.285000', 
# '09:17:08.570000', 
# '09:25:42.855000', 
# '09:34:17.140000', 
# '09:42:51.425000', 
# '09:51:25.710000'] 

如果我是你,我會做我的數學爲原料分鐘,並使用datetime.time只將結果保存爲更多的東西便於攜帶。

試試這個:

import datetime 

start_time = 9 # per user input 
end_time = 10 # per user input 
divisions = 4 # per user input 

total_minutes = (end_time-start_time)*60 
increment = total_minutes // divisions 

minutes = [start_time*60] 
while minutes[-1] < end_time*60: 
    # < end_time*60 - increment to exclude end_time from result 
    minutes.append(minutes[-1] + increment) 

times = [datetime.time(c//60,c%60) for c in minutes] 
# [09:00:00, 
# 09:15:00, 
# 09:30:00, 
# 09:45:00, 
# 10:00:00] 
+0

請注意,由於您要求進行均勻分割,因此「分鐘」是此代碼將執行的最佳分辨率。正如@Jordonias在對你的問題發表評論時提到的,如果你想分裂8次(每次7.5分鐘),這段代碼不會完全失敗,但它不會是正確的。 –

+1

謝謝你的幫助 - 這正是我所需要的! – Manish