2010-08-11 75 views
1

我在文件中有以下格式的行。使用Python比較不同格式的日期和時間

摘要;會議;說明;無; DateStart; 20100629T110000; DateEnd; 20100629T120000;時間; 20100805T084547Z

我需要創建一個有兩個輸入的功能:HH:以下格式的時間日期和時間MM和日期爲mmddyyyy。 (這些是字符串)。現在函數需要讀取這一行,看看輸入的日期和時間是否在DateStart(20100629T11000)和DateEnd(20100629T120000)之間。我如何處理這個問題,因爲輸入和行中的日期和時間格式有兩種格式?

回答

2

您可以parse a string into a datetime with strptime

>>> datetime.datetime.strptime('20100629T110000', '%Y%m%dT%H%M%S') 
datetime.datetime(2010, 6, 29, 11, 0) 
>>> datetime.datetime.strptime('23:45 06192005', '%H:%M %m%d%Y') 
datetime.datetime(2005, 6, 19, 23, 45) 

然後你就可以比較(<<=等),這兩個日期時間。

+1

+1擊敗我吧! – katrielalex 2010-08-11 10:52:27

+0

你好肯尼,你使用的是什麼版本的Python。我使用2.4,我已經導入所有必需的,但我使用datetime.datetime.strptime時出現錯誤。 – user392409 2010-08-11 11:24:53

+0

@user:'datetime.strptime'從2.5開始可用,如鏈接所示。你可以使用'time.strptime',但是API不太面向對象。爲什麼不升級到Python 2.7? – kennytm 2010-08-11 11:38:24

1

要處理日期和時間,請使用Python的datetime模塊。該模塊中的datetime類具有從字符串讀取日期時間的方法,稱爲strptime。所以你可以這樣做:

# read the file, so that: 
strStart = "20100629T110000" 
strEnd = "20100629T120000" 
imTime = "HH:MM" 
inDate = "mmddyyyy" 

import datetime 
dateStart = datetime.datetime.strptime(strStart, "%Y%m%dT%H%M%S") 
dateEnd = datetime.datetime.strptime(strEnd, "%Y%m%dT%H%M%S") 
dateIn = datetime.datetime.strptime(inDate + inTime, "%m%d%Y%H:%M") 

assert dateStart < dateIn < dateEnd 

N.B.您可以使用csv來讀取文件。

1

datetime模塊中使用datetime類。這裏有一個功能可以滿足你的需求,但你可能需要調整邊界條件:

from datetime import datetime 
def f(row, datestr, timestr): 
    tmp = row.split(";") 
    start = datetime.strptime(tmp[5], "%Y%m%dT%H%M%S") 
    end = datetime.strptime(tmp[7], "%Y%m%dT%H%M%S") 
    mytimestamp = datetime.strptime(datestr+timestr, "%d%m%Y%H:%M") 
    if (start < mytimestamp and mytimestamp < end): 
     print "inside" 
    else: 
     print "not inside" 

>>> f("Summary;meeting;Description;None;DateStart;20100629T110000;DateEnd;20100629T120000;Time;20100805T084547Z", "29062010", "11:00") 
not inside 
>>> f("Summary;meeting;Description;None;DateStart;20100629T110000;DateEnd;20100629T120000;Time;20100805T084547Z", "29062010", "11:30") 
inside