2010-08-11 47 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