2012-05-15 48 views
2

工作,我有我工作的地方有很多時間和時間差的問題。到目前爲止,我已經用許多if語句解決了這個問題,但這些都很容易出錯。在尋找一個更好的解決方案,並沒有重新發明輪子,我遇到了時間,日期和timedelta。但這些似乎對我來說太不靈活,所以我正在尋找關於如何使用Python的內置功能來解決這個問題的思路和技巧 - 如果可能的話。問題在於:將衛星數據從地區劃分爲常規網格涉及大量簡單的時間計算。如果我有時間整數:200702100700我要加減從這樣的時間格式小時,分鐘,使其日 - 18會給我,考慮到閏年,可以去交,年,月,日落後一個新的日期並轉發。以下是我對python的datetime包的理解:與時間,日期,timedelta

from datetime import timedelta, date, time 
t1 = date(2007,01,01); t = time(12,0); t2 = datetime.combine(t1,t) 
t3 = timedelta(hours=18); t4 = t2 - t3; t5 = t2 + t3 
print t4 
>>>datetime.timedelta(2006, 23401, 3001) 

這段時間在執行數千次計算的腳本中不是非常有用。我的問題是,t4沒有年,月或日的對象,2006年似乎被視爲小時。這一切都很混亂。這可能在python/numpy/scipy中嗎?如果是這樣,有人可以給我一個小費?

回答

4

Gerrat這樣做是正確,使用datetime對象。

可以充分創建DateTime對象,而無需單獨創建日期和時間(或使用datetime.strptime())。

BUG ALERT您的代碼和一些發佈的響應將注入一個難以看到的錯誤。

// this works 
datetime(2007,01,01,12) 
// this breaks 
datetime(2007,01,09,12) 

在Python中,在「09」中輸入「0」,使其成爲一個八進制數(「09」是無效的),在代碼中使用的日期時,避免了前導零。

+1

菲爾。在我自己的代碼中,我永遠不會在任何數字前面加上'0',但是並沒有真正考慮這裏的分支。 – Gerrat

+1

偉大的一點!我會確保我避免這樣做。通常,這種填充的主要原因是搜索文件字符串或創建這樣的字符串。我的文件就是這樣。 – Shejo284

2

要使用什麼是DateTime對象,不是約會對象:

from datetime import datetime, timedelta 
t1 = datetime(2007, 01, 01) 
print t1 - timedelta(days=18) 
>>>datetime.datetime(2006, 12, 14, 0, 0) 
print t1 - timedelta(hours=18) 
>>>datetime.datetime(2006, 12, 31, 6, 0) 

這將小時,分鐘和秒的工作,以及!

+0

感謝,這將很好地工作! – Shejo284

3
from datetime import datetime, timedelta, date, time 
t2 = datetime(2007, 1, 1, 12, 0, 0); 
t3 = timedelta(hours=18); t4 = t2 - t3; t5 = t2 + t3 
print "YEAR", t4.year 
print "MONTH", t4.month 
print "DAY", t4.day 
print "HOUR", t4.hour 
print "MINUTE", t4.minute 

運行的是......

[Mike_Pennington ~]$ python foo.py 
YEAR 2006 
MONTH 12 
DAY 31 
HOUR 18 
MINUTE 0 
[Mike_Pennington ~]$ 
+0

謝謝,這將很好地工作! – Shejo284