2017-10-29 68 views
1

我有在%M%d%Y格式即12012013为1月12日2013年蟒有效的方式来验证日期

我的时间大的文件来执行两两件事:

1)验证日期
2)将其存储在一个列表排序时间格式

进行验证:使用日期时间

 try: 
      parsedDate = datetime.strptime(date, '%m%d%Y') 
      return parsedDate 
     except: 
      return None' 

采取了很多的时间解析日期。由于格式是mmddyyyy,我可以验证它而不使用datetime有效吗?

2)按时间顺序:我不想将它转换为日期时间,然后对其进行排序,有没有一种方法可以使用字符串进行排序。我已经检查了很多答案,但几乎所有人都假定你有一个列表然后对它进行排序。

我想插入一个排序格式?

+0

是否要将验证的日期作为字符串或日期时间对象返回?如果转换不是必需的,只需拆分字符串并进行整数范围检查。 –

+0

我打算做同样的事情,但之后我不得不考虑闰年案件,一个月中有几天的案件是31,30,以及我想避免的所有其他变更。此外我还想排序日期 –

+0

你怎么知道这是日期时间,这会减慢你的速度? –

回答

0
  1. 的datetime模块是相当不错的,还是你需要的任何其他选项,您可以验证为reg表达式,请检查:match dates using python regular expressions

  2. 排序日期而不转换为日期时间。只需将其转换为yyyymmdd格式,然后进行字符串排序或仅创建一个空列表,然后将字符串附加到基于值更大或更小的正确位置。

会要求你自己尝试一下:)

+0

排序到yyyymmdd应该工作。感谢那!。我会检查正则表达式部分! –

+0

好的,如果你发现有困难,请告诉我。 –

0

如果格式%m%d%Y,最有效的是使用正则表达式(大约有一些分析)。

例如:

import re 
import datetime 

match_date = re.compile(r'(\d{2})(\d{2})(\d{4})$').match 

text = '12012013' 
mo = match_date(text) 

if mo: 
    date = datetime.date(int(mo.group(3)), int(mo.group(1)), int(mo.group(2))) 
    print(date) 
    # -> 2013-12-01 

这样,正则表达式将做滤波的第一级别并且所述date构造第二(与异常)。当然,你可以改进你的RegEx,这对于演示来说是微不足道的。

如果您事先知道您的日期全部有效,您可以避免转换为date,并使用tuple(年,月,日)进行排序,而不是使用date

+0

这似乎比OP的原始解决方案慢,如果你问我... –

+0

令人惊讶。我们需要基准。 –