在python中转换d-m-Y.

时间:2011-07-26 11:01:57

标签: python datetime

我想将日期从一种格式转换为另一种格式。比方说,我有一些日期:

February 27, 1820
April 3, 1885

我想转换它:

27 February 1820
3 April 1885

我尝试过但收到错误:

dt = "February 12, 1809" 
dt = datetime.strptime('%d %b %Y') 

任何形式的帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

time.strftimedatetime.datetime.strftime也不接受1900年以下的年份值。因此看起来re有工作(尽管使用它是一种不好的风格)任务):

>>> import re
>>> s = 'February 27, 1820'
>>> month, day, year = re.findall('(\w+) (\d+), (\d+)', s)[0]  
>>> '%s %s %s' % (day, month, year)
'27 February 1820'

答案 1 :(得分:1)

使用datetime.datetime.strptimeparsedatetimedateutil来解析您的字符串。

然后使用datetime.datetime.strftime将日期时间对象格式化为使用所需格式的字符串。

答案 2 :(得分:1)

您可以使用strptime / strftime

from datetime import datetime

date = datetime.strptime('February 27, 1820', '%B %d, %Y')
new_date = date.strftime('%d %b %Y')

然而,有一个问题。 strftime似乎有多年的问题< 1900在一些平台上。它也有一个workaround

答案 3 :(得分:1)

昨天,我从Kirk Strauser那里了解到 strptime())比其他解决方案慢得多:见this file

所以我的建议是用另一种方式。例如:

import re

ss = '''February 27, 1820
a line
April 3, 1885'''

regx = re.compile('(January|February|March|'
                  'April|May|June'
                  'July|August|September|'
                  'October|November|December)'
                  ' '
                  '(\d|[012]\d|3[01])'
                  ',(?= \d{4})')

print regx.findall(ss)
print
print regx.sub('\\2 \\1',ss)

编辑1

使用 regx.sub(repl,ss)可以提高程序的速度, repl()是一个不提取月份和日期的函数作为组(1)和组(2),但通过切片:

import re
from time import clock

ss = '''February 27, 1820
a line
April 3, 1885'''

regx = re.compile('(January|February|March|'
                  'April|May|June'
                  'July|August|September|'
                  'October|November|December)'
                  ' '
                  '(\d|[012]\d|3[01])'
                  ',(?= \d{4})')

print regx.findall(ss)
print


te = clock()
for i in xrange(10000):
    x = regx.sub('\\2 \\1',ss)
print clock()-te
print x
print




regx = re.compile('(?:January|February|March|'
                  'April|May|June'
                  'July|August|September|'
                  'October|November|December)'
                  ' '
                  '(?:\d|[012]\d|3[01]),'
                  '(?= \d{4})')

def repl(mat):
    sp = mat.group().split()
    return sp[1][0:-1] + ' ' + sp[0]

te = clock()
for i in xrange(1):
    y = regx.sub(repl,ss)
print clock()-te
print y

结果

[('February', '27'), ('April', '3')]

2.52965614345
27 February 1820
a line
3 April 1885

0.378833622709
27 February 1820
a line
3 April 1885
PS:我也知道strftime和strptime(不是在1900年之前)存在时间跨度的问题,这就是为什么我立即选择用正则表达式处理问题的原因。人们发现正则表达式太沉重而且令人印象深刻,但我不了解这种趋势,因为只要掌握一点正则表达式,你就可以用效率和速度做很多事情。 Hura是正则表达式工具。