2017-10-29 72 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

令人驚訝。我們需要基準。 –