2011-08-04 10 views
8

Mam kilka łańcuchach daty w tej formie: -Konwersja datę ciąg do RRRRMMDD

30th November 2009 
31st March 2010 
30th September 2010 

chcę je tak: -

YYYYMMDD 

Obecnie robię to : -

parsed_date = "30th November 2009" 
    part = parsed_date.split(' ') 
    daymonth = part[0].strip(string.ascii_letters) 
    mytime = daymonth+" "+part[1]+" "+part[2] 
    time_format = "%d %B %Y" 
    cdate = time.strptime(mytime, time_format) 
    newdate = str(cdate[0])+str(cdate[1])+str(cdate[2]) 

to działa, ale jestem pewien, że istnieje lepszy sposób ...

Odpowiedz

10

Spróbuj dateutil:

from dateutil import parser 

dates = ['30th November 2009', '31st March 2010', '30th September 2010'] 

for date in dates: 
    print parser.parse(date).strftime('%Y%m%d') 

wyjściowa:

20091130 
20100331 
20100930 

lub jeśli chcesz zrobić to za pomocą standardowego datetime moduł:

from datetime import datetime 

dates = ['30th November 2009', '31st March 2010', '30th September 2010'] 

for date in dates: 
    part = date.split() 
    print datetime.strptime('%s %s %s' % (part[0][:-2]), part[1], part[2]), '%d %B %Y').strftime('%Y%m%d') 
+0

Dzięki, to jest idealne :) –

5

Można niemal zrobić to za pomocą kombinacji strptime and strptime from the datetime module .

Problem polega na tym, że wbudowane formaty obsługują daty takie jak 30 November 2010, ale nie 30th November 2010. Tak więc w poniższym przykładzie użyłem a regular expression substitution, aby usunąć problematyczne znaki. (Wyrażenie regularne korzysta z funkcji sprawdzania, czy "st", "nd", "rd" lub "th" jest poprzedzone cyfrą, a jeśli tak, zamienia ją na pusty ciąg, usuwając go z ciągu znaków.)

>>> import re 
>>> from datetime import datetime 
>>> mydate = "30th November 2009" 
>>> mydate = re.sub("(?<=\d)(st|nd|rd|th)","",mydate) 
>>> mydate 
'30 November 2009' 
>>> mydatetime = datetime.strptime(mydate,"%d %B %Y") 
>>> mydatetime 
datetime.datetime(2009, 11, 30, 0, 0) 
>>> mydatetime.strftime("%Y%M%d") 
'20090030'